案例对象和对象之间的区别

case中的对象和对象在scala中有区别吗?

案例类与普通class的不同之处在于:

  1. 模式匹配支持
  2. equalshashCode默认实现
  3. 序列化的默认实现
  4. toString的更漂亮的默认实现
  5. 他们从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 classclass相似,当没有任何代表附加状态信息的字段时,我们只使用case object而不是case class