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

时间:2009-10-27 16:41:44

标签: java scala

我正在尝试使用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解决问题?

4 个答案:

答案 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会有所帮助,因为更好的解决方案可能会更加明显。