scala之旅-核心语言特性【case class】(十三)

Case 类和一般的类类似,但是有些细小的区别,后面会讲。case 类对不可变数据建模非常友好。在后面的介绍中,我们将会在模式匹配中展示其优越性

定义一个Case类

一个最小的case类需要关键字 case class,一个标志符和一个参数列表(参数列表可以为空)

case class Book(isbn: String)

val frankenstein = Book("978-0486282114")

注意,实例化case类Book时是不需要new关键字的。这是因为case类默认会有一个apply方法,这个方法会负责对象构造。

当你创建一个有参数的case类时,这些参数都是public val 修饰的。

case class Message(sender: String, recipient: String, body: String)
val message1 = Message("guillaume@quebec.ca", "jorge@catalonia.es", "Ça va ?")

println(message1.sender)  // prints guillaume@quebec.ca
message1.sender = "travis@washington.us"  // this line does not compile

你无法对 message1.sender 重新赋值。因为这个变量是一个val 值(val 值是不可变的). var 在case类的也是可以用的,但是不推荐使用。

对象比较

case类的实例是通过结构比较而不是通过引用:

case class Message(sender: String, recipient: String, body: String)

val message2 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val message3 = Message("jorge@catalonia.es", "guillaume@quebec.ca", "Com va?")
val messagesAreTheSame = message2 == message3  // true

尽管message2和message3指向不同的对象,但是对象的每个值是相等的。

对象复制

你可以用copy方法实现从一个case类实例进行复制一个(浅)副本出来。你也可以有选择地修改构造器的实参

case class Message(sender: String, recipient: String, body: String)
val message4 = Message("julien@bretagne.fr", "travis@washington.us", "Me zo o komz gant ma amezeg")
val message5 = message4.copy(sender = message4.recipient, recipient = "claire@bourgogne.fr")
message5.sender  // travis@washington.us
message5.recipient // claire@bourgogne.fr
message5.body  // "Me zo o komz gant ma amezeg"

message5的sender是用的message4的recipient值,但是message4的body是直接复制过去的。

 

posted @ 2020-10-28 10:54  周周周文阳  阅读(160)  评论(0编辑  收藏  举报