將類定義為case類會生成許多模板代碼:
- apply方法,可以省去new 關鍵字創建新實例
- case class的構造函數參數默認是val,會自動生成訪問方法,var會自動生成修改方法
- 會生成一個默認toString方法
- 會生成equals和hashCode方法
- 一個copy方法
當然我們也可以使用 override 重寫方法
首先,介紹一下scala類的主構造函數:
- 構造函數參數
- 類內部被調的方法
- 類內部被執行的語句和表達式
然后就是構造函數字段的可見性: - 字段被聲明為var,scala會自動生成getter和setter方法
- 如果被聲明為val,會自動生成getter方法
- 如果沒有var或val的修飾符,會保守不生成getter和setter方法
- var和val可以被private關鍵字修飾,可以防止生成getter和setter
如果想要覆寫scala自動生成的getter和setter方法。
//error: this won't work
class People(val name: String) {
def name = name
def name_ = (aName: String) {
name = aName
}
}
這個是無法編譯通過的,可以嘗試下的方法
class People(var _name: String) {
def name = _name
def name_= (s: String){
this._name = s
print(s"$name")
}
}
val p = new People("jude")
println(p.name)
p.name = "bitch"
res:
jude
bitch
說明這里參考scala編程實戰使用this.name_=s會報java.lang.StackOverflowError,scala 版本為2.13.2,修改為this._name
emmm,有點偏離最初的想法了,最開始只是想在不用case class的情況下,只使用class實現一下case class的getter和setter方法。雖然很簡單,但是還是貼一下代碼吧。
class People(val name: String, val age: Int){
def apply(name: String, age: Int): People = new People(name, age)
override def toString = s"$name is $age years old"
}