case对象和scala中的对象有什么区别吗?
当前回答
Case类与常规类的不同之处在于:
模式匹配支持 equals和hashCode的默认实现 序列化的默认实现 toString的一个更漂亮的默认实现,以及 它们从scala.Product中自动继承的少量功能。
模式匹配、equals和hashCode对于单例来说并不重要(除非你做了一些真正退化的事情),所以你基本上只是得到了序列化、一个漂亮的toString和一些你可能永远不会使用的方法。
其他回答
我们以前知道对象和“case类”。但是“case object”是两者的混合,即它是一个类似于对象的单例,并且在case类中有很多样板。唯一的区别是样板文件是为对象而不是类编写的。
Case对象不会与以下对象一起出现:
应用、取消应用方法。 这里没有复制方法,因为这是一个单例。 没有结构相等比较的方法。 也没有构造函数。
Case类与常规类的不同之处在于:
模式匹配支持 equals和hashCode的默认实现 序列化的默认实现 toString的一个更漂亮的默认实现,以及 它们从scala.Product中自动继承的少量功能。
模式匹配、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$
case对象隐式地带有方法toString、equals和hashCode的实现,但简单对象没有。 case对象可以序列化,而简单对象不能,这使得case对象作为Akka-Remote的消息非常有用。 在object关键字之前添加case关键字使对象可序列化。
scala> object foo
定义对象foo
scala> case object foocase
定义对象foocase
序列化的区别:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo$不能强制转换到scala。可序列化的 ... 43省略
scala> foocase.asInstanceOf[Serializable]
res1: Serializable = foocase
toString的区别:
scala> foo
res2: foo。类型= foo$@7bf0bac8
scala> foocase
res3: foocase。Type = foocase