有没有办法强制类成员成为Scala中的公共字段?
class X {
val number = 0
}
我希望number
成为公共领域;我不想要使用getter / setter的私有字段的默认行为。
我能找到的唯一讨论是this,但没有确定的答案。
谢谢!
编辑:我的特定用例是通过脚本引擎(Rhino / Nashorn)访问该字段。虽然我更愿意有一个更通用的解决方案。
答案 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