样例类就像普通类,但是有一些关键的区别,我们后面会提到。样例类很擅长构建不可变数据。接下来,我们会发现它们在模式匹配中很有用。
定义一个样例类
一个最简化的样例类需要关键字case class
、标识符以及一个参数列表(也有可能是空的)。
1 | case class Book(isbn: String) |
注意这里实例化样例类Book
时并没有使用关键字new
。这是因为样例类默认有一个apply
方法来构造对象。
当你创建一个带有参数的样例类时,这些参数默认是公有(val
)的。
1 | case class Message(sender: String, recipient: String, body: String) |
你不能对message1.sender
重新赋值,因为它是一个val
(即不可变的)。当然,也可以在样例类中使用var
,但是不鼓励这样做。
比较
样例类比较的是其中的结构而非引用:
1 | case class Message(sender: String, recipient: String, body: String) |
虽然message2
和message3
指向不同的对象,但是它们的值是相等的。
复制
你可以直接使用copy
方法来复制一个样例类的实例,甚至可以改变其构造器的参数。
1 | case class Message(sender: String, recipient: String, body: String) |
message4
中的recipient值传给了message5
中的sender,而message4
中的body
被直接复制过去了。