`

Scala case class

 
阅读更多

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。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics