案例类

转载自https://www.yiibai.com/scala/scala-case-classes-and-case-object.html

案例类(Case classes)和普通类差不多,只有几点关键差别,接下来的介绍将会涵盖这些差别。案例类非常适合用于不可变的数据。

定义一个案例类

一个最简单的案例类定义由关键字case class,类名,参数列表(可为空)组成:

  def main(args: Array[String]): Unit = {

    case class Book(isbn: String)

    val frankenstein = Book("978-0486282114")
    println(frankenstein.isbn)
  }

注意在实例化案例类Book时,并没有使用关键字new,这是因为案例类有一个默认的apply方法来负责对象的创建。

当你创建包含参数的案例类时,这些参数是公开(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(不可变)。在案例类中使用var也是可以的,但并不推荐这样。

 

比较

案例类在比较的时候是按值比较而非按引用比较

 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?")
    println(message2 == message3)

尽管message2message3引用不同的对象,但是他们的值是相等的,所以message2 == message3true

 

拷贝

你可以通过copy方法创建一个案例类实例的浅拷贝,同时可以指定构造参数来做一些改变。

    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")
    println(message5.sender)  // travis@washington.us
    println(message5.recipient) // claire@bourgogne.fr
    println(message5.body)  // "Me zo o komz gant ma amezeg"
  

上述代码指定message4recipient作为message5sender,指定message5recipient为”claire@bourgogne.fr”,而message4body则是直接拷贝作为message5body了。

 

补充:

1) 案例类中的参数是不可改变的,那么,如果在某些场景下,需要对这些参数做出修改呢?

添加var关键字即可:

case class UserBean(var name:String,var age:Int)

 2) 案列类中构造函数的参数从外部是可以被访问到的,而普通类中构造函数的参数,是无法从外部被访问到的:

package caseclass

class Demo(field:String = "hello") {

}

package caseclass

object Demo2 {

  var d1: Demo = _

  def main(args: Array[String]): Unit = {
    val d = new Demo("hi")
    //d.field = "hello"
    //println(d.field)
  }

}

 

posted @ 2020-02-29 17:46  盛夏群岛  阅读(206)  评论(0)    收藏  举报