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

  }
}

  https://blog.csdn.net/accptanggang/article/details/78575710


免責聲明!

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



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