案例類別就像一般類別,有幾個我們將會探討的關鍵差異。案例類別適用於建模不可變資料。在巡禮的下一步,我們將看到它們如何在 模式比對 中發揮作用。
定義案例類別
一個最小的案例類別需要關鍵字 case class
、一個識別碼和一個參數清單(可以是空的)
case class Book(isbn: String)
val frankenstein = Book("978-0486282114")
儘管通常會省略,但可以明確使用 new
關鍵字,例如 new Book()
。這是因為案例類別預設有一個 apply
方法,負責物件建構。
當您建立一個帶有參數的案例類別時,這些參數是公開的 val
。
case class Message(sender: String, recipient: String, body: String)
val message1 = Message("[email protected]", "[email protected]", "Ça va ?")
println(message1.sender) // prints [email protected]
message1.sender = "[email protected]" // this line does not compile
您無法重新指定 message1.sender
,因為它是一個 val
(即不可變)。可以在案例類別中使用 var
,但並不建議這麼做。
比較
案例類別的實例會依結構比較,而非依參考
case class Message(sender: String, recipient: String, body: String)
val message2 = Message("[email protected]", "[email protected]", "Com va?")
val message3 = Message("[email protected]", "[email protected]", "Com va?")
val messagesAreTheSame = message2 == message3 // true
即使 message2
和 message3
參考不同的物件,每個物件的值都是相等的。
複製
只要使用 copy
方法,就可以建立案例類別實例的(淺層)副本。您可以選擇變更建構函式的引數。
case class Message(sender: String, recipient: String, body: String)
val message4 = Message("[email protected]", "[email protected]", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "[email protected]")
message5.sender // [email protected]
message5.recipient // [email protected]
message5.body // "Me zo o komz gant ma amezeg"
message4
的收件者用作 message5
的寄件者,但 message4
的 body
已直接複製。
更多資源
- 在 Scala 書籍 中深入了解案例類別