它不能通过参数初始化,并且只能与自身进行比较(单例)。因此,其等值和哈希代码函数没有任何优势。有人遇到过有用的情况吗?
它不能通过参数初始化,并且只能与自身进行比较(单例)。因此,其等值和哈希代码函数没有任何优势。有人遇到过有用的情况吗?
你可以使用case对象代替枚举。
详细信息可以在此处找到:Scala中的Case对象与枚举比较
来自该问题的简化示例:
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 = "$"
}
sealed
关键字时,编译器会警告匹配不全的情况。因此,这段代码:
val ccy: Currency = EUR
ccy match {
case EUR =>
println("Euro")
}
会导致
警告:(27,7)匹配可能不完全。
它将无法处理以下输入:USD
ccy match {
Enumeration
提供withName()
)这使它们在使用 Akka-Remote 作为消息时非常有用。
编辑:
正如Rüdiger Klaehn指出的那样,我们从case
关键字中还获得了其他好处。 还有:
对于类:
apply
和unapply
实现的伴随对象(此列表可能不全!)
case object Foo; foo.toString
将只返回 Foo,而 object Foo; Foo.toString
将返回类似于 Foo$@1bb485e7 的内容(每次运行时都不同!)。hashCode 也是如此:case 对象的 hashCode 在不同的 JVM 进程中将是相同的。 - Rüdiger KlaehnSerializable
(以及其他一些东西)。 - Sascha Kolberg
None
是case object
。实际上,当您的“代数数据类型”中的某个实例应该被区分但没有任何参数时,您会使用 case 对象。就像Option
一样,Some(v)
是case class
,但None
只是没有状态的None
。关于为什么case
很有用,请参见:https://dev59.com/2m435IYBdhLWcg3wrSPN - dmitryakka
中有许多用作消息的案例对象,例如PoisonPill
、Tick
等。 - ymonad