案例对象和对象之间的区别
case中的对象和对象在scala中有区别吗?
案例类与普通class的不同之处在于:
- 模式匹配支持
-
equals
和hashCode
默认实现 - 序列化的默认实现
-
toString
的更漂亮的默认实现 - 他们从
scala.Product
自动inheritance的less量function。
模式匹配,equals和hashCode对单例无关紧要(除非你做了一些真正的退化),所以你几乎只是获得序列化,一个很好的toString
,以及一些你可能不会用到的方法。
这里有一个区别 – case对象扩展了Serializable
特征,所以它们可以被序列化。 常规对象不能默认:
scala> object A defined module A scala> case object B defined module B 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@e7da60 scala> oos.writeObject(B) scala> oos.writeObject(A) java.io.NotSerializableException: A$
scala> object foo
定义对象foo
scala> case object foocase
定义对象foocase
序列化区别:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException:foo $不能转换为scala.Serializable
… 43消失了
scala> foocase.asInstanceOf[Serializable]
res1:Serializable = foocase
toString区别:
scala> foo
res2:foo.type = foo $ @ 7bf0bac8
scala> foocase
res3:foocase.type = foocase
case对象隐式地带有方法toString,equals和hashCode的实现,但是简单的对象却没有。 case对象可以被序列化,而简单对象则不能,这使得case对象作为Akka-Remote的消息非常有用。 在object关键字之前添加case关键字使对象可序列化。
它与case class
和class
相似,当没有任何代表附加状态信息的字段时,我们只使用case object
而不是case class
。