web-dev-qa-db-fra.com

Différence entre la classe de cas et l'objet de cas?

J'apprends Scala et Akka et dans ma récente recherche d'une solution , j'ai trouvé quelque chose comme

 case class TotalTaxResult(taxAmount:Double)
 case object TaxCalculationTimeout

Quelle est la différence entre les deux?

Quand devrais-je utiliser l'un sur l'autre?

43
daydreamer

Une classe de cas peut prendre des arguments, donc chaque instance de cette classe de cas peut être différente en fonction des valeurs de ses arguments. Un objet case, en revanche, ne prend pas d'arguments dans le constructeur, il ne peut donc y avoir qu'une seule instance (un singleton, comme un scala object is).

Si votre message à votre acteur n'a pas besoin de différenciation de valeur, utilisez un objet case. Par exemple, si vous aviez un acteur qui travaillait et que vous vouliez de l'extérieur lui dire de travailler, alors peut-être que vous feriez quelque chose comme ça:

case object DoWork

...

def receive = {
  case DoWork => 
     //do some work here
}

Mais si vous vouliez une certaine variation dans la façon dont le travail est effectué, vous devrez peut-être redéfinir votre message comme suit:

case class DoWorkAfter(waitTime:Long)

...

def receive = {
  case class DoWorkAfter(time) =>
    context.system.scheduler.scheduleOnce(time.milliseconds, self, DoWork)

  case DoWork => 
     //do some work here
}
61
cmbaxter

Un objet case est une classe de cas singleton. Ils sont utilisés comme des valeurs d'énumération similaires. Il peut être utilisé dans la correspondance de motifs comme n'importe quelle autre valeur:

TaxCalculationTimeout match {
  case TaxCalculationTimeout => println("hello")
}

Lorsque vous définissez une classe de cas, vous créez un modèle pour les instances de cette classe. TotalTaxResult(1.0) et TotalTaxResult(2.0) sont deux valeurs différentes du même type. Alors qu'il existe exactement une valeur TaxCalculationTimeout.

6
gregghz

En termes simples, Scala est un langage de programmation orienté objet et fonctionnel. Il a des caractéristiques de programmation fonctionnelle comme la correspondance de motifs avec une méthodologie orientée objet pure.

Parfois, nous devons créer un objet singleton sans aucune valeur comme passer un signal pour la correspondance de modèle. Si scala n'ont pas de concept d'objet case, nous devons simplement utiliser enum ou est égal à une valeur de chaîne dans la correspondance. Mais ce n'est pas une lisibilité en langage orienté objet pur. Dans ce scénario, nous sommes utilisation de l'objet de cas

Les classes de cas sont utilisées lorsque nous devons créer plusieurs objets avec des valeurs différentes.

3

Vous pouvez penser que ces deux éléments sont comme une classe et un objet en général. Lorsque vous effectuez une classe de cas ClassName (liste de paramètres), il crée un modèle de création d'objets et l'objet de cas définit un objet singleton dans la portée dans laquelle il est déclaré. En commençant par Scala 2.10, vous devez toujours utiliser des objets case au lieu de classes case sans arguments. Donc, lorsque vous voulez faire une correspondance de modèle sur certaines valeurs qui ont besoin d'arguments, vous devez opter pour une classe case , mais si vos valeurs ne prennent pas d'arguments, vous devez utiliser un objet case.

2
Prashant_Sharma