11---
22layout : tour
3- title : Case Classes
3+ title : 案例类( Case Classes)
44
55discourse : false
66
@@ -13,3 +13,48 @@ language: zh-cn
1313next-page : pattern-matching
1414previous-page : multiple-parameter-lists
1515---
16+
17+ 案例类(Case classes)和普通类差不多,只有几点关键差别,接下来的介绍将会涵盖这些差别。案例类非常适合用于不可变的数据。下一节将会介绍他们在[ 模式匹配] ( pattern-matching.html ) 中的应用。
18+
19+ ## 定义一个案例类
20+ 一个最简单的案例类定义由关键字` case class ` ,类名,参数列表(可为空)组成:
21+ ``` tut
22+ case class Book(isbn: String)
23+
24+ val frankenstein = Book("978-0486282114")
25+ ```
26+ 注意在实例化案例类` Book ` 时,并没有使用关键字` new ` ,这是因为案例类有一个默认的` apply ` 方法来负责对象的创建。
27+
28+ 当你创建包含参数的案例类时,这些参数是公开(public)的` val `
29+ ```
30+ case class Message(sender: String, recipient: String, body: String)
31+ val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")
32+
33+ println(message1.sender) // prints guillaume@quebec.ca
34+ message1.sender = "travis@washington.us" // this line does not compile
35+ ```
36+ 你不能给` message1.sender ` 重新赋值,因为它是一个` val ` (不可变)。在案例类中使用` var ` 也是可以的,但并不推荐这样。
37+
38+ ## 比较
39+ 案例类在比较的时候是按值比较而非按引用比较:
40+ ```
41+ case class Message(sender: String, recipient: String, body: String)
42+
43+ val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
44+ val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
45+ val messagesAreTheSame = message2 == message3 // true
46+ ```
47+ 尽管` message2 ` 和` message3 ` 引用不同的对象,但是他们的值是相等的,所以` message2 == message3 ` 为` true ` 。
48+
49+ ## 拷贝
50+ 你可以通过` copy ` 方法创建一个案例类实例的浅拷贝,同时可以指定构造参数来做一些改变。
51+ ```
52+ case class Message(sender: String, recipient: String, body: String)
53+ val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
54+ val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
55+ message5.sender // travis@washington.us
56+ message5.recipient // claire@bourgogne.fr
57+ message5.body // "Me zo o komz gant ma amezeg"
58+ ```
59+ 上述代码指定` message4 ` 的` recipient ` 作为` message5 ` 的` sender ` ,指定` message5 ` 的` recipient ` 为"claire@bourgogne.fr ",而` message4 ` 的` body ` 则是直接拷贝作为` message5 ` 的` body ` 了。
60+
0 commit comments