web-dev-qa-db-ja.com

ケースクラスとケースオブジェクトの違いは?

私はScalaとAkkaを学んでおり、最近の ソリューション の検索で、

 case class TotalTaxResult(taxAmount:Double)
 case object TaxCalculationTimeout

2つの違いは何ですか?

いつ他を使用する必要がありますか?

43
daydreamer

ケースクラスは引数を取ることができるため、そのケースクラスの各インスタンスは、引数の値に基づいて異なる場合があります。一方、caseオブジェクトはコンストラクターで引数を受け取らないため、そのインスタンスは1つしか存在できません(通常のscala object isのようなシングルトン)。

アクターへのメッセージに値の区別が必要ない場合は、ケースオブジェクトを使用します。たとえば、何らかの仕事をする俳優がいて、外部から仕事をするように伝えたい場合は、次のようなことをするでしょう。

case object DoWork

...

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

ただし、作業の実行方法に何らかのバリエーションが必要な場合は、次のようにメッセージを再定義する必要があります。

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

ケースオブジェクトは、シングルトンケースクラスです。列挙値のようなものが使用されます。他の値と同様に、パターンマッチングで使用できます。

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

ケースクラスを定義すると、そのクラスのインスタンスのテンプレートが作成されます。 TotalTaxResult(1.0)TotalTaxResult(2.0)は、同じタイプの2つの異なる値です。一方、TaxCalculationTimeout値は1つだけです。

6
gregghz

簡単に言えば、Scalaはオブジェクト指向および関数型プログラミング言語です。純粋なオブジェクト指向の方法論によるパターンマッチングなどの関数型プログラミングの機能を備えています。

パターンマッチングのために信号を渡すような値のないシングルトンオブジェクトを作成する必要がある場合があります。 scalaがcaseオブジェクトの概念を持たない場合、enumを使用するか、マッチングで文字列値と等しい必要があります。しかし、これは純粋なオブジェクト指向言語の可読性ではありません。ケースオブジェクトの使用

ケースクラスは、異なる値を持つ複数のオブジェクトを作成する必要がある場合に使用されます。

3

これら2つは、一般的なクラスとオブジェクトのように考えることができます。ケースクラスClassName(params list)を実行すると、オブジェクトを作成するための青写真が作成され、ケースオブジェクトは宣言されたスコープ内のシングルトンオブジェクトを定義します。 Scala 2.10で始まる、引数なしのケースクラスの代わりに常にケースオブジェクトを使用する必要があります。 、ただし、値が引数をとらない場合は、caseオブジェクトを使用する必要があります。

2
Prashant_Sharma