在java中把屬性私有,然後提供公有方法來訪問。
public void setAge(int newValue) { if(newValue > age){ age=newValue; } }
之所以說getter和setter方法比公有字段更好,是因爲它們讓你可以從簡單的get/set機制出發,並在需要的時候做些改進。
scala定義類並定義get/set方法。
class Person { //變成私有並改名 private var privateAge = 0 def age = privateAge def age_=(newValue: Int) { if (newValue > privateAge) { //不能變年輕 privateAge = newValue; } } }
測試
class Person { //變成私有並改名 private var privateAge = 0 def age = privateAge def age_=(newValue: Int) { if (newValue > privateAge) { //不能變年輕 privateAge = newValue; } } } object Person { def main(args: Array[String]) { val fred = new Person fred.age = 30 fred.age = 21 println(fred.age) } }
結果
30
在scala中,getter和setter分別叫做age和age
注意:
如果字段是私有的,則getter和setter方法也是私有的。
如果字段是val,則只有getter方法被生成。
如果你不需要任何getter或setter,可以將字段聲明爲private[this]
在getter方法的定義中並沒有(),因此,你必須以不帶圓括號的方式來調用。
class Counter { private var value = 0 def increment() { value += 1 } //聲明中沒有() def current = value } object Counter { def main(args: Array[String]) { var counter = new Counter counter.increment println(counter.current) } }
結果
1
總結一下,在實現屬性時你有如下四個選擇:
1.var foo: Scala自動合成一個getter和一個setter。
2.val foo: Scala 自動合成一個getter。
3.由你來定義foo和foo_=方法。
4.由你來定義foo方法。
注意:在scala中,你不能實現只寫屬性(即帶有setter但不帶getter的屬性)!!
之所以訪問other.value是合法的,是因爲other也同樣是Counter對象。
class Counter_1 { private var value = 0 def increment() { value += 1 } def isLess(other: Counter_1) = value < other.value //可以訪問另一個對象的私有字段 } object Counter_1 { def main(agrs: Array[String]) { var counter_1 = new Counter_1 var counter_2 = new Counter_1 counter_1.increment print(counter_2.isLess(counter_1)) } }
結果
true
scala允許定義更加嚴格的訪問限制,通過private[this]這個修飾符來實現。
class Counter_2 { private[this] var value = 0 } object Counter_2 { def main(args: Array[String]) { var counter_2 = new Counter_2(); counter_2.value } }
結果
錯誤: 找不到或無法加載主類 cn.chinahadoop.scala_20140602.Counter_2
分析:
private[this] var value=0 //類似某個對象.value這樣的訪問將不被允許。