Scala:我可以声明一个公共字段,在编译时不会生成getter和setter吗?

guo*_*jin 14 scala

在Scala中声明val或var时,Scala会在编译为字节码时自动为您生成私有字段以及getter和setter.

例如

class myClass {
    val name = "My Name"
}
Run Code Online (Sandbox Code Playgroud)

将编译以创建等效的

class myClass {
    private string name;
    public string name();
    public void name_$eq(string);
}
Run Code Online (Sandbox Code Playgroud)

其中name()和name_ $ eq是私有字符串名称的getter和setter.

我知道你可以迫使它不声明为私人[这] VAL/VAR等等为私人领域的getter和setter方法,但我需要能够创建一个公共领域不会产生getter和setter在编译时.

这在Scala中甚至可能吗?

谢谢

Emi*_*l H 8

生成的类不包含getter或setter,如您提供的示例中所示.生成的类不包含java bean getter或setter.要实际为编译器生成getXsetX方法,var您需要用它来注释该变量@BeanProperty.

如果您希望从java访问公共字段,我认为您遗憾的是运气不好.至少,我还没有看到只使用scala实现这一目标的方法.

你可以通过混合scala和java来实现它.使用java类:

public abstract class JavaClassWithPublicField {
   public String name = "My name";
}
Run Code Online (Sandbox Code Playgroud)

然后在你的scala代码中继承该类:

class ScalaClassWithPubilcField extends JavaClassWithPublicField
Run Code Online (Sandbox Code Playgroud)

这可能是最干净的方式.

  • "getter"不是一个名为`getX`的方法,也不是一个名为`setX`的"setter"方法.由于语言的语法限制,Java具有getter和setter名称的约定.Scala没有,并且getter被称为`x`,而setter被称为`x_ =`(或从Java看到的`x_ $ eq`). (3认同)