在Scala中声明val或var时,Scala会在编译为字节码时自动为您生成私有字段以及getter和setter。
E.g。
class myClass {
val name = "My Name"
}
将编译以创建等效的
class myClass {
private string name;
public string name();
public void name_$eq(string);
}
其中name()和name_ $ eq是私有字符串名称的getter和setter。
我知道你可以通过将它们声明为私有[this] val / var blah来强制它不为私有字段提供getter和setter,但是我需要能够创建一个不生成getter的公共字段编译时的setters。
这在Scala中甚至可能吗?
由于
答案 0 :(得分:8)
生成的类不包含getter或setter,如您提供的示例所示。生成的类不包含java bean getter或setter。要让编译器为getX
生成setX
和var
方法,您需要使用@BeanProperty
注释该变量。
如果您希望从java访问公共字段,我认为遗憾的是您运气不好。至少,我还没有看到只使用scala来实现这一目标的方法。
你可以通过混合scala和java来实现它。使用java类:
public abstract class JavaClassWithPublicField {
public String name = "My name";
}
然后在你的scala代码中继承该类:
class ScalaClassWithPubilcField extends JavaClassWithPublicField
这可能是最干净的方法。
答案 1 :(得分:3)
大概你想要强制表示你的属性,因为你是从Java访问的。 (如果你试图通过去除吸气剂来“优化”你的字节代码,那么你就是在浪费你的时间,虚拟机会快速内联它们。)不幸的是,为了将来尽可能地敞开大门改进,Scala规范don't specify how Scala code should be translated to byte code。这意味着即使您找到适用于给定版本Scala的技巧,也不能保证在后续版本中有效。
在这些情况下,推荐的方法是用Java编写Java可见代码,然后用Scala写一个小的胶水类 - 就像@Emil给出的答案一样好。