我看到了关于这个问题的几个问题,但仍然找不到一个很好的答案:
我想要一个State Enum
, 有 3 个状态:Good
, NotGood
, 和Unknown
.
到现在为止,没什么大不了的。但由于状态来自外部 API(未记录,这就是Unknown
状态的原因),它使用蛇案例,所以我做了一个findByName
转换:
object State extends Enumeration {
val Good = Value("good")
val NotGood = Value("not_good")
val Unknown = Value("unknown") // "unknown" ??
def findByName(name: String): State.Value = {
Try(State.withName(name)).getOrElse {
Logger.warn(s"Found unexpected result: $name")
Unknown
}
}
}
现在,有两个问题:
第一:我希望编译器警告我有关非详尽匹配的信息。这可以使用密封特征来实现,这导致了我的第二个问题
第二:在
Unknown
我想保存收到的值的情况下,但Enums
在定义时获取名称,而不是在构造时获取名称。但是如果我有一个密封的特征,就像这个教程一样,我怎么能定义这样的场景呢?
我得到了类似的东西:
sealed abstract class State(val name: String)
case object Good extends State("good")
case object NotGood extends State("not_good")
case object Unknown extends State("unknown")
尽管如此,它unknown
是硬编码的,我希望它是一个参数/构造函数参数。
还有,财产丢了findByname
……
虽然我更喜欢使用“纯”Scala 的解决方案,但也希望看到一些使用 Shapeless 或 Cats 的解决方案