Есть ли разница между объектом case и объектом в scala?
case
для сопоставления с образцом, это просто сахар. Реализация unapply
себя делает работу.
Есть ли разница между объектом case и объектом в scala?
case
для сопоставления с образцом, это просто сахар. Реализация unapply
себя делает работу.
Ответы:
Классы Case отличаются от обычных классов тем, что они получают:
equals
иhashCode
toString
, иscala.Product
. Сопоставление с образцом, equals и hashCode не имеют большого значения для одиночных игр (если вы не делаете что-то действительно вырожденное), так что вы в значительной степени просто получаете сериализацию, хороший toString
и некоторые методы, которые вы, вероятно, никогда не будете использовать.
object
том же, что и синглтон. Это не. Скорее, это именно то, что он говорит, это объект, то есть объявление и создание экземпляра в одном. Это ограничивает object
один экземпляр, если он определен в области действия пакета, что фактически делает его одноэлементным, но только если он определен В ЭТОЙ ОБЛАСТИ. Если он определен внутри класса, вы можете иметь столько же экземпляров, сколько и сам класс (он создается лениво, поэтому не обязательно 1-1). И эти внутренние объекты вполне можно использовать в качестве ключей хеширования, что делает значение по умолчанию equals / hashCode очень разумным.
case object
не в классе, почему это правильный ответ?
case class
и class
. Вопрос о разнице между case object
а object
.
Вот одно отличие - объекты 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
определенный объект
Разница в сериализации:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ нельзя преобразовать в scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Serializable = foocase
разница строк:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
объекты case неявно поставляются с реализациями методов toString, equals и hashCode, но простые объекты этого не делают. объекты case могут быть сериализованы, а простые объекты - нет, что делает объекты case очень полезными в качестве сообщений с помощью Akka-Remote. Добавление ключевого слова case перед ключевым словом object делает объект сериализуемым.
Мы знаем объекты и «класс дела» раньше. Но «объект case» представляет собой смесь обоих, то есть он представляет собой синглтон, похожий на объект и имеющий множество шаблонов, как в классе case. Разница лишь в том, что шаблон сделан для объекта, а не для класса.
объекты case не будут поставляться со следующими:
Применить, Отменить методы. здесь нет методов копирования, так как это единственный. Нет метода для сравнения структурного равенства. Также нет конструктора.