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

时间:2012-04-27 08:33:36

标签: scala

在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中甚至可能吗?

由于

2 个答案:

答案 0 :(得分:8)

生成的类不包含getter或setter,如您提供的示例所示。生成的类不包含java bean getter或setter。要让编译器为getX生成setXvar方法,您需要使用@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给出的答案一样好。