黑猴子的家:Scala 样例类

样例类首先是类,除此之外,它是为模式匹配而优化的类,样例类用case关键字进行声明,
这个类是不是抽象的无所谓

1、样例类的创建

因为样例类没有实例化的价值,所以设计成abstract类,当然不是abstract类也是可以的

package unit6

abstract class Amount
case class Dollar(value: Double) extends Amount
case class Currency(value: Double, unit: String) extends Amount
case object Nothing extends Amount

尖叫提示:样例类 一定要加参数,伴生对象不用
样例类,是不能声明自己的主构造器,并且,样例类是没有权限修改自己的伴生类对象的,这一切都是自动生成的

2、属性值绑定到变量

当我们有一个类型为Amount的对象时,我们可以用模式匹配来匹配他的类型,并将属性值绑定到变量

println("样例类匹配, 天生就是用来匹配的,类似于java中的枚举")
for (amt <- Array(Dollar(1000.0), Currency(1000.0, "EUR"), Nothing)) {
  val result = amt match {
    case Dollar(v) => "$" + v
    case Currency(_, u) => u
    case Nothing => "  -  "
  }
  println(amt + ": " + result)
}

当你声明样例类时,如下几件事情会自动发生
--(1)构造其中的每一个参数都成为val——除非它被显式地声明为var(不建议这样做)
--(2)在半生对象中提供apply方法让你不用new关键字就能构造出相应的对象,比如Dollar(29.95)或Currency(29.95, "EUR")
--(3)提供unapply方法让模式匹配可以工作
--(4)将生成toString、equals、hashCode和copy方法——除非显式地给出这些方法的定义。
除上述外,样例类和其他类型完全一样。你可以添加方法和字段,扩展它们。

样例类,天生就是用来做,模式匹配的,模式匹配里面就两东西,apply 和 unapply
apply 是为了实例化 case 样例类的, unapply是匹配的时候,解封数据用的,只要你的这个类是样例类,自动生成 apply和unapply方法

转载于:https://www.jianshu.com/p/d3d2d3ef4079

猜你喜欢

转载自blog.csdn.net/weixin_34274029/article/details/91182459