为什么Scala有案例对象?

Dra*_*orn 5 scala

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

Ber*_*ium 9

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

可以在此处找到详细信息:案例对象与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 = "$"
}
Run Code Online (Sandbox Code Playgroud)

好处

  • 这样可以有更多字段(与ID和名称相比Enumeration)
  • 编译器警告(在sealed类型层次结构的情况下),如果匹配不是详尽的.

所以这段代码

val ccy: Currency = EUR
ccy match {
  case EUR =>
    println("Euro")
}
Run Code Online (Sandbox Code Playgroud)

会导致

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

缺点

  • 没有"按名称获取"方法(Enumeration提供withName())
  • 你无法迭代"所有"元素


Sas*_*erg 5

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

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

编辑: 正如RüdigerKlaehn指出的那样,这不是我们从case关键字中获得的唯一好处.还有:

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

对于课程另外:

  • 模式匹配优化
  • 具有实用性applyunapply实现性的伴随对象

(此列表可能不详尽!)