Scala case class
case class很像普通的类,它们的差异我们在后面会解释。case class适用于建模不变的数据。
定义一个case class
一个最小的case class需要关键字case class,一个标识符和一个参数列表(这个可以为空):
case class Book(isbn: String) { } object Book { def main(args: Array[String]): Unit = { val frankenstein = Book("978-0486282114") println(frankenstein) } }
注意当初始化Book case class时没有用new关键字。这是因为case class默认有一个apply方法会关注对象的构造。
当你用参数创建一个case class时,参数时public的val s。
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(是不可变的),可以在case class中使用var s来声明变量,但是这是不被鼓励的。
比较
case class是根据结构来进行比较的,不是根据引用。
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 class实例的副本(浅拷贝)。你可以随意的改变构造器的参数。
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"
message4的recipient被用作message5的sender,message4的body被直接拷贝到message5。