在网上发现一篇非常好的文章,正好我在做Scala系列博客,于是转载到我的博客中。
在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下:
1、初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new;
1 | scala> case class Iteblog(name : String) |
4 | scala> val iteblog = Iteblog( "iteblog_hadoop" ) |
5 | iteblog : Iteblog = Iteblog(iteblog _ hadoop) |
7 | scala> val iteblog = new Iteblog( "iteblog_hadoop" ) |
8 | iteblog : Iteblog = Iteblog(iteblog _ hadoop) |
2、toString的实现更漂亮;
2 | res 5 : Iteblog = Iteblog(iteblog _ hadoop) |
3、默认实现了equals 和hashCode;
1 | scala> val iteblog 2 = Iteblog( "iteblog_hadoop" ) |
2 | iteblog 2 : Iteblog = Iteblog(iteblog _ hadoop) |
4 | scala> iteblog == iteblog 2 |
4、默认是可以序列化的,也就是实现了Serializable ;
04 | scala> import java.io. _ |
07 | scala> val bos = new ByteArrayOutputStream |
08 | bos : java.io.ByteArrayOutputStream = |
10 | scala> val oos = new ObjectOutputStream(bos) |
11 | oos : java.io.ObjectOutputStream = java.io.ObjectOutputStream @ 4 c 257 aef |
13 | scala> oos.writeObject(iteblog) |
16 | a : A = $iwC$$iwC$A @ 71687 b 10 |
18 | scala> oos.writeObject(a) |
19 | java.io.NotSerializableException : $iwC$$iwC$A |
5、自动从scala.Product中继承一些函数;
6、case class构造函数的参数是public级别的,我们可以直接访问;
2 | 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. 。来看下面的例子:
01 | object TermTest extends scala.App { |
02 | def printTerm(term : Term) { |
17 | def isIdentityFun(term : Term) : Boolean = term match { |
18 | case Fun(x, Var(y)) if x == y = > true |
21 | val id = Fun( "x" , Var( "x" )) |
22 | val t = Fun( "x" , Fun( "y" , App(Var( "x" ), Var( "y" )))) |
25 | println(isIdentityFun(id)) |
26 | println(isIdentityFun(t)) |