案例类(case class)和案例对象(case object)有什么区别?

66

我正在学习Scala和Akka,最近在寻找一个解决方案时,发现了类似下面的东西:

 case class TotalTaxResult(taxAmount:Double)
 case object TaxCalculationTimeout

这两个之间有什么区别?

我应该在什么情况下使用一个而不是另一个?

4个回答

85

一个案例类(case class)可以带有参数,因此该案例类的每个实例都可以基于其参数的值而不同。另一方面,案例对象(case object)在构造函数中不需要传递参数,因此只能存在一个实例(单例,就像普通的 Scala object 一样)。

如果您要发送给您的 actor 的消息不需要任何值差异,则使用案例对象。例如,如果您有一个执行某些工作的 actor,并且您想要从外部告诉它去执行工作,那么您可能会像这样做:

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
}

7

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

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

当你定义一个case class时,你创建了一个该类实例的模板。TotalTaxResult(1.0)TotalTaxResult(2.0)是同一类型的两个不同值。而TaxCalculationTimeout只有一个值。


4
简单来说,Scala是一种面向对象和函数式编程语言。它具有函数式编程的特点,如纯面向对象方法的模式匹配。
有时,我们需要创建没有任何值的单例对象,例如传递某些信号进行模式匹配。如果Scala没有case object的概念,我们只需要在匹配中使用枚举或等于某个字符串值。但这不符合纯面向对象语言的可读性。在这种情况下,我们使用Case Object。
当我们需要创建具有不同值的多个对象时,使用Case类。

2

您可以将它们视为一般类和对象的两个实例。 当您执行一个case class ClassName(params list)时,它会创建一个制作对象的蓝图,而case object则在其声明的范围内定义了一个单例对象。 从Scala 2.10开始,您应该始终使用没有参数的case objects代替case classes。 因此,当您想对需要参数的一些值进行模式匹配时,请选择case class,但如果您的值不需要参数,则应使用case object。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接