scala 類

在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這樣的訪問將不被允許

 

 

 

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