我正在尝试使用TwiP获得Scala中Java public static final
的真正等价物。
在val
中创建object
对我不起作用,因为它是新生成的类Example$.class
的一部分,而TwiP无法从类{{1}访问它}。
以下是我尝试移植到Scala的Java类的示例:
Example.class
但我不知道如何将public static final String[] MY_STRINGS = { "A", "B", "C" };
@Test
public void myTest(@Values("MY_STRINGS") String string) {
...
}
移植到Scala。如果它是像这里的对象中的val那么
public static final
我只得到以下例外:
@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")
}
如何使用Scala解决问题?
答案 0 :(得分:11)
object Foo{
val MY_STRINGS=Array("A","B","C")
}
class Foo{
import Foo.MY_STRINGS
}
伴随对象中的val
定义创建了public static final
变量,import
声明在您编写类的代码中为它提供了一个很好的简单别名。 / p>
请注意,如果从Java调用此代码,Scala中的public static final
变量仍会编译为静态方法调用。
编辑:由于Scala 2.7中存在一个错误,我有点错误,我在另一个答案中详细说明了这个错误。
答案 1 :(得分:3)
以下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与非静态参数生成方法一起使用。
答案 2 :(得分:2)
您只需在伴随对象中将变量定义为“val”。
object Foo{
val MyStrings = Array("A","B","C")
}
注意:scala中的最终静态变量不遵循与Java中相同的约定。看一眼: http://docs.scala-lang.org/style/naming-conventions.html
答案 3 :(得分:1)
如果使用var,则可以创建自己的getter和setter,如果已经设置了值,则不要更改它。
这可能不是最好的方法,但如果您能解释为什么要对变量使用public static final
会有所帮助,因为更好的解决方案可能会更加明显。