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是直接复制过去的。