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除了在模式匹配時能發揮其強大的威力之外,在進行其它應用時,也顯示出了其強大的功能。*/
}
}
