在 Scala 中存在 case class, 它其实就是一个普通的 class 但是它又和普通的 class 略有区别, 如下:
1 初始化的时候可以不用 new, 当然你也可以加上, 普通类一定需要加 new;
- scala> case class Iteblog(name:String)
- defined class Iteblog
- scala> val iteblog = Iteblog("iteblog_hadoop")
- iteblog: Iteblog = Iteblog(iteblog_hadoop)
- scala> val iteblog = new Iteblog("iteblog_hadoop")
- iteblog: Iteblog = Iteblog(iteblog_hadoop)
2toString 的实现更漂亮;
- scala> iteblog
- res
- 5
- : Iteblog = Iteblog(iteblog_hadoop)
3 默认实现了 equals 和 hashCode;
- scala> val iteblog2 = Iteblog("iteblog_hadoop")
- iteblog2: Iteblog = Iteblog(iteblog_hadoop)
- scala> iteblog == iteblog2
- res
- 6
- : Boolean = true
- scala> iteblog.hashCode
- res
- 7
- : Int =
- 57880342
4 默认是可以序列化的, 也就是实现了 Serializable ;
- scala> class A
- defined class A
- scala> import java.io._
- import java.io._
- scala> val bos = new
- ByteArrayOutputStream
- bos:
- java.io.ByteArrayOutputStream
- =
- scala> val oos = new
- ObjectOutputStream(bos)
- oos:
- java.io.ObjectOutputStream
- =
- java.io.ObjectOutputStream
- @
- 4
- c
- 257
- aef
- scala> oos.writeObject(iteblog)
- scala> val a = new A
- a: A = $iwC$$iwC$A@
- 71687
- b
- 10
- scala> oos.writeObject(a)
- java.io.NotSerializableException
- : $iwC$$iwC$A
5 自动从 scala.Product 中继承一些函数;
6case class 构造函数的参数是 public 级别的, 我们可以直接访问;
- scala> iteblog.name
- res
- 11
- : String = iteblog_hadoop
7 支持模式匹配;
其实感觉 case class 最重要的特性应该就是支持模式匹配这也是我们定义 case class 的唯一理由, 难怪 Scala 官方也说: It makes only sense to define case classes if pattern matching is used to decompose data structures. 来看下面的例子:
- object TermTest extends scala.App {
- def printTerm(term: Term) {
- term match {
- case Var(n) =>
- print(n)
- case Fun(x, b) =>
- print("^" + x + ".")
- printTerm(b)
- case App(f, v) =>
- print("(")
- printTerm(f)
- print(" ")
- printTerm(v)
- print(")")
- }
- }
- def isIdentityFun(term: Term): Boolean = term match {
- case Fun(x, Var(y)) if x == y => true
- case _ => false
- }
- val id = Fun("x", Var("x"))
- val t = Fun("x", Fun("y", App(Var("x"), Var("y"))))
- printTerm(t)
- println
- println(isIdentityFun(id))
- println(isIdentityFun(t))
- }
来源: http://www.bubuko.com/infodetail-2534865.html