探索Scala(7)-- 字段

本文討論一下在Scala語言裏,字段(Fields)是如何實現的

字段實際上是getter/setter方法

在Scala裏,字段是通過varval關鍵字來定義的。var字段是可讀寫的,val字段是只讀的。下面是一個簡單的例子:

class MyObj {
    var intVar = 1
    val strVal = "str"
}
反編譯之後,可以得到下面的Java代碼:

public class MyObj {

    private int intVar = 1;
    private final String strVal = "str";

    public int intVar() {return intVar;}
    public void intVar_$eq(int intVar) {this.intVar = intVar;}

    public String strVal() {return strVal;}

}
可見:
  • 對於var字段,Scala編譯器會生成相應的Java字段和一對兒getter/setter方法
  • 對於val字段,編譯器會生成final字段和getter方法
  • getter方法和字段同名
  • setter方法爲:字段名_$eq

抽象字段

因爲字段實際上就是getter/setter方法,所以在Scala裏,可以定義抽象字段(只要不賦初始值即可):

abstract class AbstractObj {
    var intVar: Int
    val strVal: String
}
反編譯之後,得到下面Java代碼:

public abstract class AbstractObj {
    public abstract int intVar();
    public abstract void intVar_$eq(int intVar);
    public abstract String strVal();
}

字段重寫

只有val字段可以被override,如下所示:

class MySubObj extends MyObj {
    override val strVal = "substr"
}
反編譯後,得到下面的Java代碼:

public class MySubObj extends MyObj {
    private final String strVal = "substr";

    @Override 
    public String strVal() {
        return strVal;
    }
}
如果不想讓val字段被子類重寫,可以給字段加上final關鍵字:
class MyObj {
    var intVar = 1
    final val strVal = "str"
}

private字段

字段默認是public,但是即使改成private,Scala仍然會給字段生成getter/setter方法。如果字段只在對象內使用,可以把字段的訪問級別設置成private[this],這樣,字段的含義就跟Java一樣了(而且擁有更小的可見範圍--只有對象自己可見):

class ObjectPrivateFields {
    private[this] var intVar = 1
    private[this] val strVal = "str"
}

生成JavaBean風格Getter/Setter方法

如果想生成JavaBean風格的getter/setter方法,可以給字段打上@BeanProperty註解:

import scala.beans.BeanProperty
class ScalaBean {
    @BeanProperty var intVar = 1
    @BeanProperty val strVal = "str"
}

參考資料

《Scala for the Impatient》




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章