1. 程式人生 > >Scala class和case class的區別

Scala class和case class的區別

arr 實現 array data https arch ctu alt 序列

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) 2、toString的實現更漂亮; scala> iteblog res5: Iteblog = Iteblog(iteblog_hadoop) 3、默認實現了equals 和hashCode; scala> val iteblog2 = Iteblog("iteblog_hadoop") iteblog2: Iteblog = Iteblog(iteblog_hadoop) scala> iteblog == iteblog2 res6: Boolean = true scala> iteblog.hashCode
res7: 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@4c257aef scala> oos.writeObject(iteblog) scala> val a = new A a: A = $iwC$$iwC$A@71687b10 scala> oos.writeObject(a) java.io.NotSerializableException: $iwC$$iwC$A 5、自動從scala.Product中繼承一些函數;
6、case class構造函數的參數是public級別的,我們可以直接訪問; scala> iteblog.name 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. 。來看下面的例子: 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)) }

Scala class和case class的區別