通常的方法是定义
sealed trait
:
sealed trait Status {
def name: String
}
object Status {
case object NotVerified extends Status {
val name = "not_verified"
}
case object Correct extends Status {
val name = "correct"
}
case object Wrong extends Status {
val name = "wrong"
}
}
或A
sealed abstract class
,在当前的scala版本中可能看起来更好:
sealed abstract class Status(val name: String)
object Status {
case object NotVerified extends Status("not_verified")
case object Correct extends Status("correct")
case object Wrong extends Status("wrong")
}
为了避免需要导入implicit,可以将它们直接放置在类型的伴生对象中。另见问题
Where does Scala look for implicits?
更多细节,尤其是章节
类型的伴生对象
.
是的,为这样的枚举定义隐式很容易重复。你必须借助反射或宏。我建议使用
Enumeratum
图书馆,它还集成了circe和quill。
以下是Circe的一个示例:
import enumeratum.values._
sealed abstract class Status(val value: String) extends StringEnumEntry {
def name: String = value
}
object Status extends StringEnum[Status] with StringCirceEnum[Status] {
val values = findValues
case object NotVerified extends Status("not_verified")
case object Correct extends Status("correct")
case object Wrong extends Status("wrong")
}
您可以在不显式定义任何编码器/解码器或从中导入任何内容的情况下使用它。
Status
以下内容:
scala> import io.circe.syntax._
scala> val status: Status = Status.Correct
status: Status = Correct
scala> status.asJson
res1: io.circe.Json = "correct"
scala> Decoder[Status].decodeJson(Json.fromString("correct"))
res2: io.circe.Decoder.Result[Status] = Right(Correct)