class与case class的区别(转载)
在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)) } |
總結
以上是生活随笔為你收集整理的class与case class的区别(转载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一句话讲清楚RDD是什么?
- 下一篇: dependencies.depende