web-dev-qa-db-fra.com

Différence entre objet case et objet

Existe-t-il une différence entre objet case et objet dans scala?

216

Les classes de cas diffèrent des classes ordinaires en ce qu'elles reçoivent:

  1. support de correspondance de modèle
  2. implémentations par défaut de equals et hashCode
  3. implémentations par défaut de la sérialisation
  4. une implémentation par défaut plus jolie de toString, et
  5. la petite quantité de fonctionnalités qu’ils obtiennent en héritant automatiquement de scala.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.

106
Dave Griffith

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$
134
axel22
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

33
Minnie Shi

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.

2
Prashant_Sharma

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.

0
jeevan kishore

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.

0
wineway