我正在学习Scala和Akka,在我最近的solution查找中,我发现了类似
的内容 case class TotalTaxResult(taxAmount:Double)
case object TaxCalculationTimeout
两者有什么区别?
我应该何时使用另一个?
答案 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类。 因此,当你想对一些需要参数的值进行模式匹配时,你应该选择一个案例类,但如果你的值没有参数,那么你应该使用一个案例对象。