Diferença entre objeto de caso e objeto


226

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


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á.


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$

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


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.


0

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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.