1. 程式人生 > >Scala中的樣例類

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