一、什麼是Case Class
Case Class是Scala中一種特殊的類,用來存儲不可變的數據,它是一個不可變的值對象,自帶equals、hashCode、toString等方法。而且Case Class定義的對象可以通過模式匹配來進行操作,這使得Case Class非常適合用於模式匹配,對於模式匹配的情況,最重要的是能夠讓你檢查編譯時的錯誤。
Case Class有以下幾個特點:
- 編譯器會自動為Case Class生成構造函數
- 自動實現equals()、hashCode()、toString()等方法
- 可以使用模式匹配(Pattern Matching)匹配各個屬性
- 可以使用copy()方法複製對象(新的對象與源對象屬性值相同,沒有改變源對象)
case class Person(name: String, age: Int)
val p1 = Person("張三", 20)
val p2 = Person("李四", 30)
println(p1.equals(p2)) // false
println(p1) // Person(張三,20)
val p3 = p1.copy(name = "王五")
println(p3) // Person(王五,20)
二、Case Class的構造函數
使用Case Class定義一個不可變的類,可以通過構造函數初始化。
默認情況下,構造函數的參數列表會被自動聲明為類的字段。Case Class比一般類更容易創建,因為它還可以省略new關鍵字。但是它也支持new關鍵字進行對象初始化創建。
case class Person(name: String, age: Int, gender: String)
// 使用構造函數初始化對象
val person1 = Person("小明", 10, "男")
println(person1.name) // 小明
println(person1.age) // 10
println(person1.gender) // 男
// 使用new關鍵字初始化對象
val person2 = new Person("小紅", 12, "女")
println(person2.name) // 小紅
println(person2.age) // 12
println(person2.gender) // 女
三、Case Class的模式匹配
Case Class最大的特點之一就是可以使用模式匹配來操作它,模式匹配也是Scala中非常強大和靈活的一個特性。通過模式匹配可以匹配某個變量的值,並根據值的不同執行不同的操作。
case class Person(name: String, age: Int)
val p = Person("小明", 18)
// 匹配name為"小明",age為18的實例
p match {
case Person("小明", 18) => println("匹配成功")
case _ => println("沒有匹配")
}
四、Case Class的copy()
在Case Class中,我們可以通過copy()方法複製對象(新的對象與源對象屬性值相同,沒有改變源對象),然後可以通過修改複製後對象的屬性值得到一個新的對象。
case class Person(name: String, age: Int)
val p1 = Person("小明", 18)
val p2 = p1.copy(name = "小紅")
println(p1) // Person(小明,18)
println(p2) // Person(小紅,18)
五、Case Class的嵌套使用
Case Class支持使用其他的Case Class對象作為它的屬性,從而實現更加複雜的數據結構定義。也就是說,Case Class可以被嵌套到另一個Case Class中。
case class Person(name: String, age: Int)
case class Book(name: String, author: Person)
val author = Person("小明", 18)
val book = Book("《Scala編程》", author)
println(book.author.name) // 小明
六、Case Class的註解
Case Class也可以使用註解,如@SerialVersionUID註解可以為Case Class生成serialVersionUID。
import java.io.Serializable
import scala.beans.BeanProperty
import scala.annotation.meta.field
@SerialVersionUID(1000L)
case class Person(@(BeanProperty @field)name: String, age: Int) extends Serializable
val p = Person("小明", 18)
println(p.serialVersionUID) // 1000
七、Case Class的不可變性
Case Class是不可變的,一旦它被創建,它的所有屬性值就不能再次更改。試圖在創建後更改Case Class對象的值會導致編譯器錯誤。
case class Person(name: String, age: Int)
val p = Person("小明", 18)
// 編譯器出現錯誤
// p.age = 19
八、Case Class的繼承
Case Class可以繼承其他類,但是遵循以下規則:
- case class和普通class在概念上不同,不能繼承case class
- case class可以繼承其他的case class
- case class的繼承者必須仍是Case Class,否則子類所繼承的auto-generation實現的特性被喪失。
abstract class Human(name: String, age: Int)
case class Person(name: String, age: Int) extends Human(name, age)
val p = Person("小明", 18)
println(p.name) // 小明
原創文章,作者:DLQN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/146569.html