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:
suporte a correspondência de padrões
implementações padrão de equalsehashCode
implementações padrão de serialização
uma implementação padrão mais bonita toStringe
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á.
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>caseobject B
defined module B
scala>import java.io._
import java.io._
scala>val bos =newByteArrayOutputStream
bos: java.io.ByteArrayOutputStream=
scala>val oos =newObjectOutputStream(bos)
oos: java.io.ObjectOutputStream= java.io.ObjectOutputStream@e7da60
scala> oos.writeObject(B)
scala> oos.writeObject(A)
java.io.NotSerializableException: A$
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.
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á.fonte
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 limitaobject
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 aclass
. A questão é sobre a diferença entrecase object
eobject
.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:fonte
extends Serializable
deve fazer o mesmo truque.Diferença de serialização:
Diferença toString:
fonte
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.
fonte
É semelhante a
case class
eclass
, apenas usamos emcase object
vez decase class
quando não há campos representando informações adicionais de estado.fonte
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.
fonte