Existe-t-il une différence entre objet case et objet dans scala?
Les classes de cas diffèrent des classes ordinaires en ce qu'elles reçoivent:
equals
et hashCode
toString
, etscala.Product
.Les correspondances de motifs, égaux et hashCode importent peu pour les singletons (à moins que vous ne fassiez quelque chose de vraiment dégénéré), de sorte que vous n'obtenez que la sérialisation, un Nice toString
, et certaines méthodes que vous n'allez probablement pas. jamais utiliser.
Voici une différence: les objets case étendent le trait Serializable
pour pouvoir être sérialisés. Les objets normaux ne peuvent pas par défaut:
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$
scala> object foo
objet défini foo
scala> case object foocase
objet défini foocase
Différence de sérialisation:
scala> foo.asInstanceOf[Serializable]
Java.lang.ClassCastException: foo $ ne peut pas être converti en scala.Serializable
... 43 élidé
scala> foocase.asInstanceOf[Serializable]
res1: Serializable = foocase
différence de chaîne:
scala> foo
res2: toto.type = toto $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
les objets case viennent implicitement avec les implémentations des méthodes toString, equals et hashCode, contrairement aux objets simples. les objets case peuvent être sérialisés, alors que les objets simples ne le peuvent pas, ce qui en fait des objets très utiles en tant que messages avec Akka-Remote. L'ajout du mot-clé case avant le mot-clé object rend l'objet sérialisable.
Nous connaissons les objets et la "classe de cas" auparavant. Mais "objet de cas" est un mélange des deux, c’est-à-dire qu’il s’agit d’un singleton similaire à un objet et comportant beaucoup de passe-partout comme dans une classe de cas. La seule différence est que le passe-partout est fait pour un objet au lieu d'une classe.
les objets case ne viendront pas avec ceux ci-dessous:
Méthodes Apply, Un-apply. il n'y a pas de méthodes de copie puisqu'il s'agit d'un singleton. Pas de méthode de comparaison d'égalité structurelle. Pas de constructeur aussi.
C'est pareil avec case class
et class
, nous utilisons simplement case object
au lieu de case class
lorsqu'il n'y a pas de champs représentant des informations d'état supplémentaires.