Разница между объектом дела и объектом

183

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

  • 3
    У него есть точка зрения - необязательно иметь объект case, чтобы иметь возможность сопоставления с образцом. Я думаю, что это не было рассмотрено в предыдущем вопросе ...
  • 3
    Я думал, что будет разница в поведении сопоставления с образцом, но и объект case, и обычный объект ведут себя одинаково в AFAIK сопоставления с образцом. Довольно сложно найти какую-либо информацию об объектах дела, поэтому я с нетерпением жду, чтобы кто-то нас просветил.
Показать ещё 3 комментария
Теги:

5 ответов

91
Лучший ответ

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

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

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

  • 4
    Наличие сопоставления с образцом имеет большой смысл, если case используется в «правильном» сценарии использования: предоставление нескольких реализаций одного абстрактного класса или свойства. Некоторые могут быть классами, некоторые могут быть одноэлементными объектами.
  • 3
    Конечно, но это работает так же хорошо для объектов case, как и не case.
Показать ещё 9 комментариев
104

Здесь один объект с разным случаем расширяет черту 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$
  • 14
    Я думаю, что объекты case могут быть сериализованы - это самое большое отличие от обычных объектов, особенно в сетевой коммуникации между актерами.
  • 13
    Добавление extends Serializable должно сделать то же самое.
26
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

1

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

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню