Scala class与Case class的区别

在网上发现一篇非常好的文章,正好我在做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 res5: Iteblog = Iteblog(iteblog_hadoop)

  3、默认实现了equals 和hashCode;

1 scala> val iteblog2 = Iteblog("iteblog_hadoop")
2 iteblog2: Iteblog = Iteblog(iteblog_hadoop)
3  
4 scala> iteblog == iteblog2
5 res6: Boolean = true
6  
7 scala> iteblog.hashCode
8 res7: 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 = newByteArrayOutputStream
08 bos: java.io.ByteArrayOutputStream =
09  
10 scala> val oos = new ObjectOutputStream(bos)
11 oos: java.io.ObjectOutputStream = java.io.ObjectOutputStream@4c257aef
12  
13 scala> oos.writeObject(iteblog)
14  
15 scala> val = new A
16 a: = $iwC$$iwC$A@71687b10
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 res11: 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 == =true
19     case _ =false
20   }
21   val id = Fun("x", Var("x"))
22   val = Fun("x", Fun("y", App(Var("x"), Var("y"))))
23   printTerm(t)
24   println
25   println(isIdentityFun(id))
26   println(isIdentityFun(t))

猜你喜欢

转载自flychao88.iteye.com/blog/2266631
今日推荐