Разница между объектом дела и объектом - PullRequest
214 голосов
/ 11 марта 2011

Есть ли разница между объектом case и объектом в scala?

Ответы [ 6 ]

134 голосов
/ 11 марта 2011

Вот одно отличие: объекты 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$
105 голосов
/ 11 марта 2011

Классы дел отличаются от обычных классов тем, что они получают:

  1. поддержка сопоставления с образцом
  2. реализации по умолчанию equals и hashCode
  3. реализации по умолчанию сериализации
  4. более симпатичная реализация по умолчанию toString и
  5. небольшое количество функциональности, которую они получают от автоматического наследования от scala.Product.

Сопоставление с образцом, equals и hashCode не имеют большого значения для одиночных игр (если вы не делаете что-то действительно вырожденное), так что вы в значительной степени просто получаете сериализацию, хороший toString и некоторые методы, которые вы, вероятно, никогда не будете когда-либо использовать.

33 голосов
/ 03 декабря 2015
scala> object foo

определенный объект foo

scala> case object foocase

определенный объект foocase

Разница в сериализации:

scala> foo.asInstanceOf[Serializable]

java.lang.ClassCastException: foo $ нельзя преобразовать в scala.Serializable
... 43 elised

scala> foocase.asInstanceOf[Serializable]

res1:Сериализуемый = foocase

toString разница:

scala> foo

res2: foo.type = foo $ @ 7bf0bac8

scala> foocase

res3: foocase.type = foocase

2 голосов
/ 13 сентября 2017

объекты case неявно поставляются с реализациями методов toString, equals и hashCode, но простые объекты этого не делают.объекты case могут быть сериализованы, а простые объекты - нет, что делает объекты case очень полезными в качестве сообщений с помощью Akka-Remote.Добавление ключевого слова case перед ключевым словом object делает объект сериализуемым.

0 голосов
/ 24 декабря 2018

Мы знаем объекты и «класс дела» раньше. Но «объект-кейс» - это сочетание того и другого, т. Е. Он является синглтоном, похожим на объект, и с множеством шаблонов, как в классе-случае. Разница лишь в том, что шаблон сделан для объекта, а не для класса.

объекты case не будут поставляться со следующими:

Применить, Отменить методы. здесь нет методов копирования, так как это единственный. Нет метода для сравнения структурного равенства. Также нет конструктора.

0 голосов
/ 12 апреля 2017

Аналогично case class и class, мы просто используем case object вместо case class, когда нет никаких полей, представляющих дополнительную информацию о состоянии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...