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