Y a-t-il une différence entre un objet et un objet dans scala?
casepour avoir une correspondance de modèle, c'est juste du sucre. Vous mettre en œuvre unapplyfait le travail.
                Y a-t-il une différence entre un objet et un objet dans scala?
casepour avoir une correspondance de modèle, c'est juste du sucre. Vous mettre en œuvre unapplyfait le travail.
                Réponses:
Les classes de cas diffèrent des classes ordinaires en ce sens qu'elles obtiennent:
equalsethashCodetoString, 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 toStringet certaines méthodes que vous n'utiliserez probablement jamais.
objectest 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 objectne concerne pas la classe, pourquoi est-ce la bonne réponse?
                    case classet a class. La question porte sur la différence entre case objectet object.
                    Voici une différence - les objets cas étendent le Serializabletrait, 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 Serializabledevrait faire la même chose.
                    scala> object fooobjet défini foo
scala> case object foocaseobjet 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> foores2: foo.type = foo $ @ 7bf0bac8
scala> foocaseres3: 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 classet class, nous utilisons juste case objectau lieu de case classquand 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.