Есть ли разница между объектом и объектом case в scala?
Классы классов отличаются от обычных классов тем, что они получают:
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$
extends Serializable
должно сделать то же самое.
scala> object foo
определенный объект foo
scala> case object foocase
определенный объект foocase
Разница в сериализации:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $нельзя отнести к scala. Сериализуемый
... 43 elided
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, но простые объекты этого не делают. случайные объекты могут быть сериализованы, пока простые объекты не могут, что делает объекты объектов очень полезными в качестве сообщений с Akka-Remote. Добавление ключевого слова case до ключевого слова объекта делает объект сериализуемым.
Он похож на case class
и class
, мы просто используем case object
вместо case class
, когда нет никаких полей, представляющих дополнительную информацию о состоянии.