是否有关于何时使用的最佳实践指南案例类 http://en.wikipedia.org/wiki/Scala_%28programming_language%29#Case_classes_and_pattern_matching(或 case 对象)与在 Scala 中扩展枚举?
它们似乎提供了一些相同的好处。
一个很大的区别是Enumeration
支持从某些实例化它们name
细绳。例如:
object Currency extends Enumeration {
val GBP = Value("GBP")
val EUR = Value("EUR") //etc.
}
然后你可以这样做:
val ccy = Currency.withName("EUR")
当希望保留枚举(例如,保存到数据库)或从文件中的数据创建枚举时,这非常有用。然而,我发现总的来说,Scala 中的枚举有点笨拙,并且有一种尴尬的附加组件的感觉,所以我现在倾向于使用case object
s. A case object
比枚举更灵活:
sealed trait Currency { def name: String }
case object EUR extends Currency { val name = "EUR" } //etc.
case class UnknownCurrency(name: String) extends Currency
所以现在我的优势是...
trade.ccy match {
case EUR =>
case UnknownCurrency(code) =>
}
As @chaotic3quilibrium https://stackoverflow.com/users/501113/chaotic3quilibrium指出(为了便于阅读进行了一些更正):
关于“UnknownCurrency(code)”模式,除了“破坏”货币代码的闭集性质之外,还有其他方法可以处理找不到货币代码字符串的情况。Currency
type. UnknownCurrency
存在类型Currency
现在可以潜入 API 的其他部分。
建议把这个案子推到外面去Enumeration
并让客户处理一个Option[Currency]
类型将清楚地表明确实存在匹配问题,并“鼓励”API 用户自行解决。
为了跟进这里的其他答案,主要缺点case object
s over Enumeration
s are:
-
无法迭代“枚举”的所有实例。情况确实如此,但我发现在实践中很少需要这样做。
-
无法从持久值轻松实例化。这也是事实,但是,除了大量枚举(例如所有货币)的情况之外,这不会带来巨大的开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)