Y a-t-il une différence entre un objet et un objet dans scala?
case
pour avoir une correspondance de modèle, c'est juste du sucre. Vous mettre en œuvre unapply
fait le travail.
Y a-t-il une différence entre un objet et un objet dans scala?
case
pour avoir une correspondance de modèle, c'est juste du sucre. Vous mettre en œuvre unapply
fait le travail.
Réponses:
Les classes de cas diffèrent des classes ordinaires en ce sens qu'elles obtiennent:
equals
ethashCode
toString
, etscala.Product
. La mise en correspondance de modèles, l'égal et le hashCode n'ont pas beaucoup d'importance pour les singletons (à moins que vous ne fassiez quelque chose de vraiment dégénéré), vous obtenez donc à peu près la sérialisation, une belle toString
et certaines méthodes que vous n'utiliserez probablement jamais.
object
est le même qu'un singleton. Ce n'est pas. C'est plutôt exactement ce qu'il dit qu'il est, un objet, c'est-à-dire une déclaration et une instanciation en un. Cela se limite object
à une seule instance si elle est définie dans la portée du package, ce qui en fait un singleton, mais uniquement si elle est définie DANS CETTE PORTÉE. Si défini dans une classe, vous pouvez avoir autant d'instances que la classe elle-même (elle est instanciée paresseusement, donc ce n'est pas nécessairement 1-1). Et ces objets internes peuvent très bien être utilisés comme clés de hachage, ce qui rend très égal par défaut / hashCode.
case object
ne concerne pas la classe, pourquoi est-ce la bonne réponse?
case class
et a class
. La question porte sur la différence entre case object
et object
.
Voici une différence - les objets cas étendent le Serializable
trait, afin qu'ils puissent ê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$
extends Serializable
devrait faire la même chose.
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: Sérialisable = foocase
Différence toString:
scala> foo
res2: foo.type = foo $ @ 7bf0bac8
scala> foocase
res3: foocase.type = foocase
Les objets case sont implicitement fournis avec les implémentations des méthodes toString, equals et hashCode, mais pas les objets simples. les objets de cas peuvent être sérialisés alors que les objets simples ne le peuvent pas, ce qui rend les objets de cas très utiles comme messages avec Akka-Remote. L'ajout du mot clé case avant le mot clé object rend l'objet sérialisable.
C'est similaire avec case class
et class
, nous utilisons juste case object
au lieu de case class
quand il n'y a pas de champs représentant des informations d'état supplémentaires.
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 avec 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 de cas ne viendront pas avec ceux ci-dessous:
Appliquer, désappliquer les méthodes. il n'y a pas de méthodes de copie puisqu'il s'agit d'un singleton. Aucune méthode de comparaison de l'égalité structurelle. Pas de constructeur aussi.