Scala中的樣例類詳解:
樣例類Case Class Case Class一般被翻譯成樣例類,它是一種特殊的類,能夠被優化以用於模式匹配。 當一個類被聲名為case class的時候,scala會幫助我們做下面幾件事情: 1、構造器中的參數如果不被聲明為var的話,它默認的是val類型的,但一般不推薦將構造器中的參數聲明為var。 2、自動創建伴生對象,同時在里面給我們實現子apply方法,使我們在使用的時候可以不直接使用new創建對象。 3、伴生對象中同樣會幫我們實現unapply方法,從而可以將case class應用於模式匹配。 4、實現自己的toString、hashCode、copy、equals方法 除此之此,case class與其它普通的scala類沒有區別
參考:
//抽象Person類 abstract class Person //樣例類Student case class Student(name: String, age: Int, stuNo: String) extends Person //樣例類Teacher case class Teacher(name: String, age: Int, teaNo: String) extends Person //樣例類 Nobody case class Nobody(name: String) extends Person object CaseClassDemo { def main(args: Array[String]): Unit = { //case class會自動生成apply方法,創建對象時無需用new val p: Person = Student("lisi", 20, "101") //match case模式匹配 p match { case Student(name, age, stuNo) => println(s"學生:$name, $age, $stuNo") case Teacher(name, age, teaNo) => println(s"老師:$name, $age, $teaNo") case Nobody(name) => println(s"其他人:$name") } /*case class常用方法,定義case class便會自動生成對應的toString,hashCode,equals,copy等方法,*/ val teacher = Teacher("jack", 30, "0010") //toString方法 println(teacher.toString) //無參copy方法 val teacher2 = teacher copy() /*特別注意: equals方法是檢查值是否相等,而eq方法檢查的是引用是否相等, 所以如果比較的對象是null那么==調用的是eq,不是null的情況調用的是equals。 在Java中如果要對兩個對象進行值比較,那么必須要實現equals 和hashCode方法。 而在scala中為開發者提供了case class,默認實現了equals 和hashCode方法。*/ //eq方法進行比較 println(teacher.eq(teacher2)) //equals方法根據對象內容進行比較 println(teacher equals (teacher2)) //==方法進行比較 println(teacher == teacher2) hashcode方法 println(teacher hashCode()) println("====================================") println(teacher2.toString) //帶一個參數的copy方法 println(teacher2.copy("tony").toString) //帶二個參數的copy方法 println(teacher2.copy("tony", 25).toString) //帶三個參數的copy方法 println(teacher2.copy("tony", 25, "1002").toString) println("====================================") /*case class在實用應用中的用途: 某個類一旦被定義為case class,則編譯器會自動生成該類的伴生對象,伴生對象中包括了apply方法及unapply方法, apply方法使得我們可以不需要new關鍵字就可以創建對象, 而unapply方法,則使得可以方便地應用在模式匹配當中, 另外編譯器還自動地幫我們實現對應的toString、equals、copy等方法。 在實際中,case class除了在模式匹配時能發揮其強大的威力之外,在進行其它應用時,也顯示出了其強大的功能。*/ } }