この問題に関してSOでいくつかの質問を見ましたが、それでも本当に良い答えを見つけることができませんでした:
、、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
}
}
}
ここで、次の 2 つの問題があります。
1 つ目: 網羅的ではない一致についてコンパイラに警告してもらいたい。これは、封印された特性を使用して達成できます。これにより、2番目の問題が発生します
2番目:
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を使用したソリューションも見たいです