關於case class


將類定義為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"
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM