Er hat einen Punkt - es ist nicht notwendig, ein Fallobjekt zu haben, um eine Musterübereinstimmung darauf zu haben. Ich denke, dies wurde in der vorherigen Frage nicht angesprochen ...
axel22
3
Ich dachte, es würde einen Unterschied im Mustervergleichsverhalten geben, aber sowohl ein Fallobjekt als auch ein normales Objekt verhalten sich in einem Mustervergleichs-AFAIK gleich. Es ist ziemlich schwierig, überhaupt Informationen über Fallobjekte zu finden, deshalb freue ich mich auf jemanden, der uns aufklärt.
Alter Mooij
4
Es ist nicht notwendig, caseMusterabgleich zu verwenden, es ist nur Zucker. unapplySich selbst zu implementieren macht den Job.
Raphael
1
Die akzeptierte Antwort beantwortet die Frage einfach nicht, wie in den Kommentaren dazu besprochen. Viel zu spät, um etwas zu bewirken, sollte aber beachtet werden.
Itsbruce
Es ist noch nicht zu spät, die akzeptierte Antwort zu bearbeiten. Die Bearbeitung wird überprüft und gegebenenfalls akzeptiert.
C4stor
Antworten:
110
Fallklassen unterscheiden sich von regulären Klassen darin, dass sie Folgendes erhalten:
Mustervergleichsunterstützung
Standardimplementierungen von equalsundhashCode
Standardimplementierungen der Serialisierung
eine schönere Standardimplementierung von toString, und
die geringe Menge an Funktionen, die sie durch das automatische Erben von erhalten scala.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 toStringund einige Methoden, die Sie wahrscheinlich nie verwenden werden.
Punkt 3 und 4 dieser Antwort sind korrekte Unterschiede zwischen Fallobjekten und Objekten. Punkt 1 und 2 spielen für Singleton-Objekte keine Rolle. Und Singleton-Objekte sind immer Produkte mit der Arität 0, sodass Punkt 5 ebenfalls keine Rolle spielt.
Wojciech Durczyński
86
Dieser Beitrag verewigt den Mythos, objectder 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 objectauf 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.
Nilskp
66
Die Frage ist case objectnicht Klasse, warum ist das die richtige Antwort?
Ixx
10
Dies beantwortet die Frage nicht. Diese Antwort befasst sich mit dem Unterschied zwischen case classund a class. Die Frage ist über den Unterschied zwischen case objectund object.
MK
6
@ C4stor Die Antwort sagt das allerdings nicht. Ein Objekt ist keine Klasse. Angesichts der Tatsache, dass Fallklassen hinter den Kulissen ziemlich viel Magie bewirken, gibt es angesichts der verschiedenen Randfälle und Komplikationen von Scala keinen Grund anzunehmen, dass der einzige Unterschied zwischen einem Standard-Scala-Objekt und einem Fallobjekt durch das erklärt wird, was wir über den Unterschied wissen zwischen Standardklassen und Fallklassen. Diese Antwort spricht nicht einmal den Wortlaut der Frage an.
Itsbruce
137
Hier ist ein Unterschied: Fallobjekte erweitern das SerializableMerkmal, sodass sie serialisiert werden können. Normale Objekte können nicht standardmäßig:
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$
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.
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.quelle
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 sichobject
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 aclass
. Die Frage ist über den Unterschied zwischencase object
undobject
.Hier ist ein Unterschied: Fallobjekte erweitern das
Serializable
Merkmal, sodass sie serialisiert werden können. Normale Objekte können nicht standardmäßig:quelle
extends Serializable
sollte jedoch den gleichen Trick ausführen.Serialisierungsunterschied:
toString Unterschied:
quelle
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.
quelle
Es ist ähnlich wie mit
case class
undclass
verwenden wir nurcase object
statt ,case class
wenn es keine Felder , die zusätzliche Statusinformationen.quelle
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.
quelle