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

Woj*_*ski 217 scala

scala中的case对象和对象之间有什么区别吗?

axe*_*l22 135

这是一个区别 - 案例对象扩展了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$
Run Code Online (Sandbox Code Playgroud)

  • 我认为案例对象可以序列化是与常规对象最不同的,特别是在演员之间的网络通信中 (15认同)
  • 添加`extends Serializable`应该做同样的技巧. (13认同)

Dav*_*ith 106

案例类与常规类的不同之处在于:

  1. 模式匹配支持
  2. 的默认实现equalshashCode
  3. 序列化的默认实现
  4. 一个更漂亮的默认实现toString,和
  5. 他们从自动继承中获得的少量功能scala.Product.

模式匹配,equals和hashCode对于单身人士来说并不重要(除非你做了一些真正退化的事情),所以你几乎只是获得序列化,一个不错的toString,以及你可能永远不会使用的一些方法.

  • 这篇文章延续了"对象"与单身人士相同的神话.它不是.相反,它正是它所说的,一个对象,即一个声明和实例化.如果在包范围中定义,这会将`object`限制为单个实例,这实际上使它成为单例,但仅在定义为IN THAT SCOPE时.如果在类中定义,则可以拥有与类本身一样多的实例(它实际上是懒惰的,因此它不一定是1-1).并且那些内部对象可以很好地用作散列键,使得默认等于/ hashCode非常合理. (84认同)
  • 问题是关于`case object`而不是class,为什么这是正确的答案? (59认同)
  • 这个答案的第3点和第4点是案例对象和对象之间的正确差异.第1点和第2点对单例对象无关紧要.单例对象总是具有arity 0的Products,因此point 5也无关紧要. (46认同)
  • 这不回答这个问题.这个答案处理`case class`和`class`之间的区别.问题是关于`case object`和`object`之间的区别. (8认同)
  • @ C4stor但答案并未说明.对象不是类.考虑到Scala的各种边缘情况和复杂情况,案例类在幕后做了相当多的魔术,没有理由简单地假设标准Scala对象和案例对象之间的唯一区别是通过我们对差异的了解来解释标准类和案例类之间.这个答案甚至没有解决问题的措辞. (5认同)
  • 如果在"正确"的用例中使用`case`,那么模式匹配很有意义:提供一个抽象类或特征的几个实现.有些可能是类,有些可能是单例对象. (4认同)
  • 当然,但对于案例对象和非案例对象一样有效. (3认同)
  • 事实上,case 对象的某些行为与 case 类的常规实例不同。一方面,模式匹配的行为不同。所以答案也不准确。 (2认同)

Min*_*Shi 34

scala> object foo
Run Code Online (Sandbox Code Playgroud)

定义了对象foo

scala> case object foocase
Run Code Online (Sandbox Code Playgroud)

定义对象foocase

序列化差异:

scala> foo.asInstanceOf[Serializable]
Run Code Online (Sandbox Code Playgroud)

java.lang.ClassCastException:foo $无法转换为scala.Serializable
... 43省略

scala> foocase.asInstanceOf[Serializable]
Run Code Online (Sandbox Code Playgroud)

res1:Serializable = foocase

toString的区别:

scala> foo
Run Code Online (Sandbox Code Playgroud)

res2:foo.type = foo $ @ 7bf0bac8

scala> foocase
Run Code Online (Sandbox Code Playgroud)

res3:foocase.type = foocase