如何在Scala中定义一个字段?

时间:2014-04-14 18:46:50

标签: scala field

有没有办法强制类成员成为Scala中的公共字段?

class X { val number = 0 }

我希望number成为公共领域;我不想要使用getter / setter的私有字段的默认行为。

我能找到的唯一讨论是this,但没有确定的答案。

谢谢!

编辑:我的特定用例是通过脚本引擎(Rhino / Nashorn)访问该字段。虽然我更愿意有一个更通用的解决方案。

3 个答案:

答案 0 :(得分:2)

由于Java的Javascript绑定基于Rhino和Rhino解释器映射.. = XXX到getXXX和XXX = foo到setXXX(foo),如果用@BeanProperty标记val,它应该&#34 ;只是工作"。

看起来像Nashorn(Java8中的Javascript)做同样的事情:winterbe.com/posts/2014/04/05/java8-nashorn-tutorial(搜索"使用getter和setter"),所以你也应该面向未来。

答案 1 :(得分:1)

Modulo name mangling:

scala> object X { private[this] val x = 7 ; @inline def getX = x }
defined object X

scala> :javap -prv X
Binary file X contains $line5.$read$$iw$$iw$X$
[snip]
{
  public static final $line5.$read$$iw$$iw$X$ MODULE$;
    flags: ACC_PUBLIC, ACC_STATIC, ACC_FINAL

  public final int $line5$$read$$iw$$iw$X$$x;
    flags: ACC_PUBLIC, ACC_FINAL

内联访问器会放松对字段的访问,该字段被命名为错误以避免冲突。这里奇怪的名字是由于REPL模板造成的。

没有REPL:

scala> classOf[x.X$].getDeclaredFields map (f => s"'${f.getName}'")
res1: Array[String] = Array('MODULE$', 'x$X$$x')

通过附加空格,正常的私有字段在Scala反射中被命名为。至少这种破损是肉眼可见的。

答案 2 :(得分:-1)

默认情况下,您通常可以看到这些值 - 因为它们默认是公开的。你不需要setter和getter。

class TestIt {
    val normalClassVariable = 10
}

class CanYouSeeIt{
  var test:TestIt = new TestIt
  test.normalClassVariable
}

这完全没问题。

修改:如果您需要更多见解,请尝试以下链接:http://daily-scala.blogspot.ch/2009/11/access-modifiers-public-private.html