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