C'è qualche differenza tra oggetto case e oggetto in scala?
case
per avere una corrispondenza del modello, è solo zucchero. L'implementazione di unapply
te stesso fa il lavoro.
C'è qualche differenza tra oggetto case e oggetto in scala?
case
per avere una corrispondenza del modello, è solo zucchero. L'implementazione di unapply
te stesso fa il lavoro.
Risposte:
Le classi di casi differiscono dalle classi normali in quanto ottengono:
equals
ehashCode
toString
, escala.Product
. Pattern matching, equals e hashCode non contano molto per i singoli (a meno che tu non faccia qualcosa di veramente degenerato), quindi stai praticamente ottenendo solo la serializzazione, un toString
metodo carino e alcuni metodi che probabilmente non utilizzerai mai.
object
è lo stesso di un singleton. Non è. Piuttosto è esattamente quello che dice che è, un oggetto, cioè una dichiarazione e un'istanza in uno. Ciò si limita object
a una singola istanza se definita nell'ambito del pacchetto, il che la rende effettivamente un singleton, ma solo se definita IN QUESTO AMBITO. Se definito all'interno di una classe, puoi avere tante istanze quante la classe stessa (è pigramente istanziata, quindi non è necessariamente 1-1). E quegli oggetti interni possono benissimo essere usati come chiavi hash, rendendo sensibilmente predefiniti equals / hashCode.
case object
non riguarda la classe, perché questa è la risposta corretta?
case class
e a class
. La domanda riguarda la differenza tra case object
e object
.
Ecco una differenza: gli oggetti case estendono il Serializable
tratto, quindi possono essere serializzati. Gli oggetti regolari non possono essere predefiniti:
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
dovrebbe fare lo stesso trucco però.
scala> object foo
oggetto definito foo
scala> case object foocase
oggetto definito
Differenza di serializzazione:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ non può essere lanciato su scala.Serializable
... 43 elided
scala> foocase.asInstanceOf[Serializable]
res1: serializzabile = foocase
toString differenza:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
gli oggetti case implicitamente includono implementazioni di metodi toString, equals e hashCode, ma gli oggetti semplici no. gli oggetti case possono essere serializzati mentre gli oggetti semplici no, il che rende gli oggetti case molto utili come messaggi con Akka-Remote. L'aggiunta della parola chiave case prima della parola chiave object rende l'oggetto serializzabile.
Conosciamo prima oggetti e "case class". Ma "case object" è un mix di entrambi, cioè è un singleton simile a un oggetto e con un sacco di boilerplate come in una classe case. L'unica differenza è che il boilerplate viene eseguito per un oggetto anziché per una classe.
gli oggetti case non verranno forniti con quelli seguenti:
Metodi di applicazione, non applicazione. qui non ci sono metodi di copia poiché questo è un singleton. Nessun metodo per il confronto dell'uguaglianza strutturale. Nessun costruttore pure.