用例类就像常规类,有一些关键区别,我们将在下面讨论。用例类非常适合建模不可变数据。在游览的下一步,我们将看到它们在 模式匹配 中如何有用。
定义用例类
一个最小的用例类需要关键字 case class
、一个标识符和一个参数列表(可以为空)
case class Book(isbn: String)
val frankenstein = Book("978-0486282114")
尽管通常省略,但可以明确使用 new
关键字,如 new Book()
。这是因为用例类默认有一个 apply
方法,它负责对象构造。
当您使用参数创建 case 类时,这些参数是公有的 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
(即不可变)。可以在 case 类中使用 var
,但这不推荐。
比较
case 类的实例是按结构而不是按引用进行比较的
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 类实例的(浅)副本。您可以选择更改构造函数参数。
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 书籍 中了解有关 case 类的更多信息