Diferença entre objeto de caso e objeto

226

Existe alguma diferença entre objeto de caso e objeto no scala?

Wojciech Durczyński
fonte
3
Ele tem razão - não é necessário ter um objeto de caso para poder padronizar a correspondência nele. Eu acho que isso não foi abordado na pergunta anterior ...
axel22
3
Eu pensei que haveria uma diferença no comportamento de correspondência de padrões, mas um objeto de caso e um objeto normal se comportam da mesma maneira em um padrão que corresponde ao AFAIK. É muito difícil encontrar qualquer informação sobre objetos de caso, por isso estou ansioso por alguém nos esclarecer.
Age Mooij
4
Não é necessário usar casea correspondência de padrões, é apenas açúcar. Implementar- unapplyse faz o trabalho.
Raphael
1
A resposta aceita simplesmente não responde à pergunta, conforme discutido nos comentários. Tarde demais para fazer a diferença, mas deve ser observado.
precisa saber é
Não é tarde para editar a resposta aceita. A edição será revisada e, se relevante, aceita.
C4stor

Respostas:

111

As classes de caso diferem das classes regulares na medida em que obtêm:

  1. suporte a correspondência de padrões
  2. implementações padrão de equalsehashCode
  3. implementações padrão de serialização
  4. uma implementação padrão mais bonita toStringe
  5. a pequena quantidade de funcionalidades que eles obtêm ao herdar automaticamente scala.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 toStringe alguns métodos que provavelmente nunca usará.

Dave Griffith
fonte
46
Os pontos 3 e 4 desta resposta são a diferença correta entre objetos de caso e objetos. Os pontos 1 e 2 não importam para objetos singleton. E os objetos singleton são sempre produtos com arity 0; portanto, o ponto 5 também não importa.
Wojciech Durczyński 14/03
86
Este post perpetua o mito que 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 objecta 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.
N
66
A questão é sobre case objectnão classe, por que essa é a resposta correta?
Ixx
10
Isso não responde à pergunta. Esta resposta lida com a diferença entre case classe a class. A questão é sobre a diferença entre case objecte object.
MK
6
@ C4stor A resposta não diz isso, no entanto. Um objeto não é uma classe. Dado que as classes de casos realizam uma boa quantidade de magia nos bastidores, considerando os vários casos e complicações extremos de Scala, não há razão simplesmente para supor que a única diferença entre um objeto Scala padrão e um objeto de caso é explicada pelo que sabemos sobre a diferença entre classes padrão e classes de caso. Esta resposta nem sequer aborda a redação da pergunta.
precisa saber é
137

Aqui está uma diferença: os objetos de caso estendem a Serializablecaracterí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$
axel22
fonte
15
Eu acho que os objetos de caso podem ser serializados é a maior diferença de objetos regulares, especialmente na comunicação de rede entre atores
爱国者
14
A adição extends Serializabledeve fazer o mesmo truque.
N
36
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

Minnie
fonte
2

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.

Prashant_Sharma
fonte
0

É semelhante a case classe class, apenas usamos em case objectvez de case classquando não há campos representando informações adicionais de estado.

wineway
fonte
0

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.

jeevan kishore
fonte