Verschil tussen case-klasse en case-object?

Ik ben Scala en Akka aan het leren en in mijn recente zoekopdracht voor een oplossing, ik heb iets gevonden als

case class TotalTaxResult(taxAmount:Double)
 case object TaxCalculationTimeout

Wat is het verschil tussen de twee?

Wanneer moet ik de een boven de ander gebruiken?


Antwoord 1, autoriteit 100%

Een case-klasse kan argumenten aannemen, dus elke instantie van die case-klasse kan anders zijn op basis van de waarden van de argumenten. Een case-object daarentegen neemt geen args in de constructor, dus er kan maar één instantie van zijn (een singleton, zoals een regulier scala objectis).

Als je bericht aan je acteur geen waardedifferentiatie nodig heeft, gebruik dan een case-object. Als je bijvoorbeeld een acteur had die wat werk deed, en je, van buitenaf, hem wilde vertellen dat hij moest werken, dan zou je misschien zoiets als dit doen:

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

Maar als je wat variatie wilt in de manier waarop het werk wordt gedaan, moet je misschien je boodschap als volgt herdefiniëren:

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
}

Antwoord 2, autoriteit 8%

Een case-object is een singleton case-klasse. Ze worden gebruikt als opsommingswaarden. Het kan net als elke andere waarde worden gebruikt bij het matchen van patronen:

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

Als u een casusklasse definieert, maakt u een sjabloon voor instanties van die klasse. TotalTaxResult(1.0)en TotalTaxResult(2.0)zijn twee verschillende waarden van hetzelfde type. Terwijl er precies één waarde is voor TaxCalculationTimeout.


Antwoord 3, autoriteit 4%

In eenvoudige bewoordingen is Scala een objectgeoriënteerde en functionele programmeertaal. Het heeft kenmerken van functioneel programmeren, zoals patroonafstemming met pure objectgeoriënteerde methodologie.

Soms moeten we een singleton-object maken zonder enige waarde, zoals het doorgeven van een signaal voor patroonovereenkomst. Als scala geen concept van case-object heeft, hoeven we alleen enum te gebruiken of is gelijk aan een tekenreekswaarde bij het matchen. Maar dit is geen leesbaarheid in pure objectgeoriënteerde taal.. In dat scenario gebruiken we Case Object

Hoofdletterklassen worden gebruikt wanneer we meerdere objecten met verschillende waarden moeten maken.


Antwoord 4, autoriteit 3%

Je kunt deze twee beschouwen als een klasse en een object in het algemeen.
Wanneer u een casusklasse ClassName (paramslijst) doet, wordt een blauwdruk gemaakt voor het maken van objecten en het casusobject definieert een singleton-object in het bereik waarin het is gedeclareerd.
Vanaf Scala 2.10 moet u altijd case-objecten gebruiken in plaats van case-klassen zonder argumenten.
Dus als u een patroonovereenkomst wilt maken voor sommige waarden waarvoor argumenten nodig zijn, moet u voor een case-klasse gaan, maar als uw waarden geen argumenten aannemen, moet u een case-object gebruiken.

Other episodes