我正在学习Scala和Akka,最近在寻找一个解决方案时,发现了类似下面的东西:
case class TotalTaxResult(taxAmount:Double)
case object TaxCalculationTimeout
这两个之间有什么区别?
我应该在什么情况下使用一个而不是另一个?
一个案例类(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
}
案例对象是一个单例案例类。它们的使用方式有点像枚举值。它可以像任何其他值一样在模式匹配中使用:
TaxCalculationTimeout match {
case TaxCalculationTimeout => println("hello")
}
当你定义一个case class时,你创建了一个该类实例的模板。TotalTaxResult(1.0)
和TotalTaxResult(2.0)
是同一类型的两个不同值。而TaxCalculationTimeout
只有一个值。
您可以将它们视为一般类和对象的两个实例。 当您执行一个case class ClassName(params list)时,它会创建一个制作对象的蓝图,而case object则在其声明的范围内定义了一个单例对象。 从Scala 2.10开始,您应该始终使用没有参数的case objects代替case classes。 因此,当您想对需要参数的一些值进行模式匹配时,请选择case class,但如果您的值不需要参数,则应使用case object。