3 回答
TA贡献1818条经验 获得超11个赞
Enumerationname
object Currency extends Enumeration {
val GBP = Value("GBP")
val EUR = Value("EUR") //etc.}val ccy = Currency.withName("EUR")case objectcase object
sealed trait Currency { def name: String }case object EUR extends Currency { val name = "EUR" }
//etc.case class UnknownCurrency(name: String) extends Currencytrade.ccy match {
case EUR =>
case UnknownCurrency(code) =>}
关于“未知数(代码)”模式,除了“破坏”封闭集属性之外,还有其他方法可以处理不查找货币代码字符串的问题。 Currency类型。 UnknownCurrency类型存在 Currency现在可以潜入API的其他部分。
把那个箱子推到外面是明智的 Enumeration并让客户处理 Option[Currency]类型将清楚地表明确实存在匹配问题,并“鼓励”API的用户自己解决这个问题。
case objectEnumeration
不能遍历“枚举”的所有实例
..当然是这样,但我发现在实践中这是非常罕见的。 无法从持久化值轻松实例化
..这也是正确的,但是,除了大量枚举(例如,所有货币)之外,这并不会带来很大的开销。
TA贡献1835条经验 获得超7个赞
trait Enum[A] {
trait Value { self: A => }
val values: List[A]}sealed trait Currency extends Currency.Valueobject Currency extends Enum[Currency] {
case object EUR extends Currency
case object GBP extends Currency
val values = List(EUR, GBP)}trait Enum[A <: {def name: String}] {
trait Value { self: A =>
_values :+= this
}
private var _values = List.empty[A]
def values = _values}sealed abstract class Currency(val name: String) extends Currency.Valueobject Currency extends Enum[Currency] {
val EUR = new Currency("EUR") {}
val GBP = new Currency("GBP") {}}trait Enum[A] {
trait Value { self: A =>
_values :+= this
}
private var _values = List.empty[A]
def values = _values}sealed trait Currency extends Currency.Valueobject Currency extends Enum[Currency] {
case object EUR extends Currency
case object GBP extends Currency}object Currency extends Enum[Currency]sealed trait Currency extends Currency.Valuecase object EUR extends Currencycase object GBP extends Currency
添加回答
举报
