Scala:class级中的公共静态决赛

我试图在Scala中使用TwiP获得Java的public static final 版本 。

object中创建val对我来说不起作用,因为它是新生成的类的一部分。 Example$.class和TwiP无法从类Example.class访问它。

这是我尝试移植到Scala的Java类的示例:

 public static final String[] MY_STRINGS = { "A", "B", "C" }; @Test public void myTest(@Values("MY_STRINGS") String string) { ... } 

但我不知道如何将public static final移植到Scala。 如果它是像这里的对象中的val

 @RunWith(classOf[TwiP]) class Foo { import Foo.MY_STRINGS @Test def testTwiP(@Values("MY_STRINGS") value: String): Unit = { println("I'm testing value " + value + ".") } } object Foo { val MY_STRINGS = Array("A", "B", "C") } 

我只得到以下exception:

 net.sf.twip.internal.TwipConfigurationError: there is no method or field 'MY_STRINGS' named in the @Values annotation of Parameter#1 

如何使用Scala解决问题?

以下Scala代码:

 class Foo{ import Bar.MY_STRINGS } object Bar{ val MY_STRINGS=Array("A","B","C") } 

生成以下Java类:

 public final class Bar extends java.lang.Object{ public static final java.lang.String[] MY_STRINGS(); public static final int $tag() throws java.rmi.RemoteException; } public final class Bar$ extends java.lang.Object implements scala.ScalaObject{ public static final Bar$ MODULE$; public static {}; public Bar$(); public java.lang.String[] MY_STRINGS(); public int $tag() throws java.rmi.RemoteException; } public class Foo extends java.lang.Object implements scala.ScalaObject{ public Foo(); public int $tag() throws java.rmi.RemoteException; } 

以下Scala代码:

 class Foo{ import Foo.MY_STRINGS } object Foo{ val MY_STRINGS=Array("A","B","C") } 

生成以下Java类:

 public class Foo extends java.lang.Object implements scala.ScalaObject{ public Foo(); public int $tag() throws java.rmi.RemoteException; } public final class Foo$ extends java.lang.Object implements scala.ScalaObject{ public static final Foo$ MODULE$; public static {}; public Foo$(); public java.lang.String[] MY_STRINGS(); public int $tag() throws java.rmi.RemoteException; } 

当对象与类同名时,静态成员未在类上定义的事实是Scala Bug#1735并且它已在Scala 2.8快照中修复。

所以看起来TwiP根本无法工作,除非您升级Scala,或者找到一种方法让TwiP与非静态参数生成方法一起使用。

 object Foo{ val MY_STRINGS=Array("A","B","C") } class Foo{ import Foo.MY_STRINGS } 

伴随对象中的val定义创建了您的public static final变量,并且import声明在您用于编写类的代码中为它提供了一个很好的简单别名。

请注意,如果从Java调用此代码,Scala中的public static final变量仍将编译为看起来像静态方法调用。

编辑:由于Scala 2.7中的错误,我有点错误,我在另一个答案中详细说明了这个错误。

您只需在伴随对象中将变量定义为“val”。

 object Foo{ val MyStrings = Array("A","B","C") } 

注意:scala中的最终静态变量不遵循与Java中相同的约定。 请查看: http : //docs.scala-lang.org/style/naming-conventions.html

如果使用var,则可以创建自己的getter和setter,如果已经设置了值,则不要更改它。

这可能不是最好的方法,但如果您能解释为什么要在变量上使用public static final ,那将会很有帮助,因为更好的解决方案可能会更加明显。