Gibt es einen Unterschied zwischen Fallobjekt und Objekt in Scala?
case
Musterabgleich zu verwenden, es ist nur Zucker. unapply
Sich selbst zu implementieren macht den Job.
Gibt es einen Unterschied zwischen Fallobjekt und Objekt in Scala?
case
Musterabgleich zu verwenden, es ist nur Zucker. unapply
Sich selbst zu implementieren macht den Job.
Antworten:
Fallklassen unterscheiden sich von regulären Klassen darin, dass sie Folgendes erhalten:
equals
undhashCode
toString
, undscala.Product
. Pattern Matching, Equals und HashCode spielen für Singletons keine große Rolle (es sei denn, Sie tun etwas wirklich Entartetes). Sie erhalten also so ziemlich nur Serialisierung, eine nette toString
und einige Methoden, die Sie wahrscheinlich nie verwenden werden.
object
der mit einem Singleton identisch ist. Es ist nicht. Vielmehr ist es genau das, was es sagt, ein Objekt, dh eine Erklärung und Instanziierung in einem. Dies beschränkt sich object
auf eine einzelne Instanz, wenn sie im Paketbereich definiert ist, wodurch sie effektiv zu einem Singleton wird, jedoch nur, wenn sie in DIESEM GELTUNGSBEREICH definiert ist. Wenn innerhalb einer Klasse definiert, können Sie so viele Instanzen haben wie die Klasse selbst (sie wird träge instanziiert, ist also nicht unbedingt 1-1). Und diese inneren Objekte können sehr gut als Hash-Schlüssel verwendet werden, was den Standardwert equals / hashCode sehr sinnvoll macht.
case object
nicht Klasse, warum ist das die richtige Antwort?
case class
und a class
. Die Frage ist über den Unterschied zwischen case object
und object
.
Hier ist ein Unterschied: Fallobjekte erweitern das Serializable
Merkmal, sodass sie serialisiert werden können. Normale Objekte können nicht standardmäßig:
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
sollte jedoch den gleichen Trick ausführen.
scala> object foo
definiertes Objekt foo
scala> case object foocase
definierte Objekt-Foocase
Serialisierungsunterschied:
scala> foo.asInstanceOf[Serializable]
java.lang.ClassCastException: foo $ kann nicht in scala.Serializable
... 43 elided umgewandelt werden
scala> foocase.asInstanceOf[Serializable]
res1: Serialisierbar = Foocase
toString Unterschied:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
case-Objekte werden implizit mit Implementierungen von Methoden toString, equals und hashCode geliefert, einfache Objekte jedoch nicht. Fallobjekte können serialisiert werden, während einfache Objekte dies nicht können, was Fallobjekte als Nachrichten mit Akka-Remote sehr nützlich macht. Durch Hinzufügen des Schlüsselworts case vor dem Schlüsselwort object wird das Objekt serialisierbar.
Wir kennen Objekte und "Fallklasse" vorher. Aber "case object" ist eine Mischung aus beidem, dh es ist ein Singleton ähnlich einem Objekt und mit viel Boilerplate wie in einer Case-Klasse. Der einzige Unterschied besteht darin, dass die Boilerplate für ein Objekt anstelle einer Klasse erstellt wird.
Fallobjekte werden nicht mit den folgenden geliefert:
Anwenden, Methoden nicht anwenden. Hier gibt es keine Kopiermethoden, da dies ein Singleton ist. Keine Methode zum Vergleich der strukturellen Gleichheit. Auch kein Konstruktor.