为什么Scala有案例对象?

时间:2015-09-16 07:32:15

标签: scala

它不能用参数进行初始化,只能与自身进行比较(单例)。所以它的equals和hash代码函数没有优势。有没有人遇到过他们认为有用的案例?

2 个答案:

答案 0 :(得分:9)

您可以使用案例对象作为枚举的替代方法。

详情请见:Case objects vs Enumerations in Scala

该问题的简化示例:

sealed trait Currency {
  def name: String
  def symbol: String
}

case object EUR extends Currency {
  val name = "EUR"
  val symbol = "€"
}

case object USD extends Currency {
  val name = "USD"
  val symbol = "$"
}

优点

  • 这样可以有更多字段(与Enumeration中的ID和名称相比)
  • 编译器发出警告(如果是sealed类型层次结构),如果匹配并非详尽无遗。

所以这段代码

val ccy: Currency = EUR
ccy match {
  case EUR =>
    println("Euro")
}

将导致

  

警告:(27,7)匹配可能并非详尽无遗   它将在以下输入上失败:美元
        ccy match {

缺点

  • 没有"得到名字"方法(Enumeration提供withName()
  • 你无法迭代"所有"元素

答案 1 :(得分:5)

我认为最重要的区别是案例对象可以序列化,而简单的对象则不能。

这使得它们作为使用Akka-Remote的消息非常有用。

修改 正如Rüdiger Klaehn所指出的,这不是我们从case关键字获得的唯一好处。还有:

  • hashCode实现
  • 一个有用的toString实现

对于其他课程:

  • 模式匹配优化
  • 具有有用的applyunapply实施
  • 的配套对象

(此列表可能并非详尽无遗!)