案例类和案例对象之间的区别?

时间:2015-08-18 17:04:57

标签: scala akka

我正在学习Scala和Akka,在我最近的solution查找中,我发现了类似

的内容
 case class TotalTaxResult(taxAmount:Double)
 case object TaxCalculationTimeout

两者有什么区别?

我应该何时使用另一个?

4 个答案:

答案 0 :(得分:60)

案例类可以接受参数,因此该案例类的每个实例可以根据其参数的值而不同。另一方面,case对象不会在构造函数中使用args,因此只能有一个实例(单例,就像常规的scala object一样)。

如果您对演员的消息不需要任何差异,请使用案例对象。例如,如果你有一个做了一些工作的演员,而你从外面想告诉它做什么,那么也许你做这样的事情:

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
}

答案 1 :(得分:6)

案例对象是单例案例类。它们有点像枚举值。它可以像其他任何值一样用于模式匹配:

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

定义案例类时,您正在为该类的实例创建模板。 TotalTaxResult(1.0)TotalTaxResult(2.0)是同一类型的两个不同值。而且只有一个TaxCalculationTimeout值。

答案 2 :(得分:2)

简单来说,Scala是一种面向对象的函数式编程语言。它具有函数式编程的功能,如模式匹配和纯面向对象的方法。

有时候,我们需要创建没有任何值的单例对象,比如为模式匹配传递一些信号。如果scala没有case对象的概念,我们只需要在匹配时使用enum或等于一些字符串值。但这不是纯面向对象语言的可读性。在那种情况下,我们使用的是Case Object

当我们需要创建具有不同值的多个对象时,使用案例类。

答案 3 :(得分:2)

你可以认为这两个就像一个类和一般的对象。 当你做一个case类ClassName(params list)时,它会创建一个用于创建对象的蓝图,case对象在声明它的作用域中定义一个singleton对象。 从Scala 2.10开始,您应该始终使用case对象而不是不带参数的case类。 因此,当你想对一些需要参数的值进行模式匹配时,你应该选择一个案例类,但如果你的值没有参数,那么你应该使用一个案例对象。