Différence entre object case et object

Y a-t-il une différence entre l’object case et l’object dans scala?

Les classes de cas diffèrent des classes ordinaires en ce sens qu’elles obtiennent:

  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 plus jolie par défaut de toSsortingng , et
  5. la petite quantité de fonctionnalités qu’ils obtiennent en héritant automatiquement de scala.Product .

La correspondance de pattern, equals et hashCode importent peu pour les singletons (à moins que vous ne fassiez quelque chose de vraiment dégénéré), vous obtenez donc une sérialisation, un joli toSsortingng et quelques méthodes que vous n’utiliserez probablement jamais.

Voici une différence: les objects de cas étendent le trait Serializable , ils peuvent donc être sérialisés. Les objects réguliers 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 

object défini foo

 scala> case object foocase 

object 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

à la différence de chaîne:

 scala> foo 

res2: foo.type = foo $ @ 7bf0bac8

 scala> foocase 

res3: foocase.type = foocase

Les objects case sont implicitement fournis avec les implémentations des méthodes toSsortingng, equals et hashCode, mais pas les objects simples. Les objects de cas peuvent être sérialisés alors que les objects simples ne le peuvent pas, ce qui rend les objects de cas très utiles en tant que messages avec Akka-Remote. L’ajout du mot-clé case avant le mot-clé object rend l’object sérialisable.

Il est similaire à la case class et à la class , nous utilisons simplement un case object au lieu d’une case class de case class lorsqu’il n’y a pas de champs représentant des informations d’état supplémentaires.