case对象和scala中的对象有什么区别吗?
当前回答
case对象隐式地带有方法toString、equals和hashCode的实现,但简单对象没有。 case对象可以序列化,而简单对象不能,这使得case对象作为Akka-Remote的消息非常有用。 在object关键字之前添加case关键字使对象可序列化。
其他回答
我们以前知道对象和“case类”。但是“case object”是两者的混合,即它是一个类似于对象的单例,并且在case类中有很多样板。唯一的区别是样板文件是为对象而不是类编写的。
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
它与case类和class类似,当没有任何字段表示额外的状态信息时,我们只是使用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$
推荐文章
- 在Scala 2.8中<:<、<%<和=:=是什么意思?它们被记录在哪里?
- Scala vs Python的Spark性能
- 什么时候我应该在Scala中选择向量?
- 在Scala中,foldLeft和reducleft的区别
- 好的scalaz介绍
- Akka Kill vs Stop vs Poison Pill?
- 如何开始与Akka流?
- Scala 2.8 breakOut
- 如何克隆一个案例类实例,只改变一个字段在Scala?
- ':_* '(冒号下划线*)在Scala中有什么作用?
- 定义一个函数时,“def”和“val”有什么区别
- 在Scala中获取列表中的项目?
- case对象和对象的区别
- Scala中的Case对象与枚举
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时