14

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

例如

class myClass {
    val name = "My Name"
}

将编译以创建等效的

class myClass {
    private string name;
    public string name();
    public void name_$eq(string);
}

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

我知道您可以通过将私有字段声明为 private[this] val/var blah 来强制它不为私有字段提供 getter 和 setter,但我需要能够创建一个在编译时不生成 getter 和 setter 的公共字段.

这在 Scala 中是否可行?

谢谢

4

2 回答 2

9

如您提供的示例中所示,生成的类不包含 getter 或 setter。生成的类不包含 java bean getter 或 setter。要真正使编译器为 a 生成getXsetX方法,var您需要使用@BeanProperty.

如果您想从 java 访问公共字段,我认为您很不幸。至少,我还没有看到仅使用 scala 来实现这一目标的方法。

您可以通过混合 scala 和 java 来完成它。使用如下 java 类:

public abstract class JavaClassWithPublicField {
   public String name = "My name";
}

然后在您的 Scala 代码中继承该类:

class ScalaClassWithPubilcField extends JavaClassWithPublicField

这可能是最干净的方法。

于 2012-04-27T11:16:47.600 回答
3

大概您想强制使用属性的表示方式,因为您是从 Java 访问的。(如果您试图通过摆脱 getter 来“优化”您的字节码,那么您就是在浪费时间,VM 会很快将它们内联。)对您来说不幸的是,为将来尽可能敞开大门改进,Scala 规范没有指定如何将 Scala 代码转换为字节码。这意味着即使您找到了适用于给定版本的 Scala 的技巧,也不能保证它在后续版本中有效。

在这些情况下,推荐的方法是用 Java 编写 Java 可见的代码,然后用 Scala 编写一个小的粘合类——就像@Emil 给出的答案一样棒。

于 2012-04-27T20:41:17.363 回答