Existe alguma diferença entre objeto de caso e objeto no scala?
case
a correspondência de padrões, é apenas açúcar. Implementar- unapply
se faz o trabalho.
Existe alguma diferença entre objeto de caso e objeto no scala?
case
a correspondência de padrões, é apenas açúcar. Implementar- unapply
se faz o trabalho.
Respostas:
As classes de caso diferem das classes regulares na medida em que obtêm:
equals
ehashCode
toString
escala.Product
. A correspondência de padrões, iguais e hashCode não importam muito para singletons (a menos que você faça algo realmente degenerado); portanto, você está apenas obtendo serialização, um bom toString
e alguns métodos que provavelmente nunca usará.
object
é o mesmo que um singleton. Não é. Pelo contrário, é exatamente o que diz ser, um objeto, ou seja, uma declaração e instanciação em um. Isso limita object
a uma única instância se definida no escopo do pacote, o que efetivamente o torna um singleton, mas somente se definido nesse escopo. Se definido dentro de uma classe, você pode ter tantas instâncias quanto a própria classe (é instanciada lentamente, portanto não é necessariamente 1-1). E esses objetos internos podem muito bem ser usados como chaves de hash, tornando o padrão igual a / hashCode muito sensato.
case object
não classe, por que essa é a resposta correta?
case class
e a class
. A questão é sobre a diferença entre case object
e object
.
Aqui está uma diferença: os objetos de caso estendem a Serializable
característica, para que possam ser serializados. Objetos regulares não podem por padrão:
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
deve fazer o mesmo truque.
scala> object foo
objeto definido foo
scala> case object foocase
objeto definido foocase
Diferença de serialização:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ não pode ser convertido em scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: Serializável = foocase
Diferença toString:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
objetos de caso implicitamente vêm com implementações dos métodos toString, equals e hashCode, mas objetos simples não. objetos de caso podem ser serializados, enquanto objetos simples, não, o que torna os objetos de caso muito úteis como mensagens com o Akka-Remote. A adição da palavra-chave case antes da palavra-chave object torna o objeto serializável.
Conhecemos objetos e "classe de caso" antes. Mas "objeto de caso" é uma mistura de ambos, ou seja, é um singleton semelhante a um objeto e com muito clichê como em uma classe de caso. A única diferença é que o padrão é feito para um objeto em vez de uma classe.
objetos de caso não virão com os abaixo:
Aplicar, cancelar a aplicação de métodos. aqui não há métodos de cópia, pois esse é um singleton. Nenhum método para comparação de igualdade estrutural. Nenhum construtor também.