我正在尝试将Enumeration
重构为具有具体类的密封特征,因为我需要在其中添加更多功能。有了密封的特征,我想具有类似于Enumeration
的{{1}}方法的功能。我已经提出了以下代码,正在寻求反馈:
withName(String)
然后我可以使用sealed trait Foo {
def name: String
}
object Foo {
case object FooA extends Foo {
override val name: String = "a"
}
case object FooB extends Foo {
override val name: String = "b"
}
val values = Seq(FooA, FooB)
def withName(name: String): Option[Foo] = {
values.find(value => value.name.equals(name))
}
}
方法来将类型为withName(String)
的相应具体对象作为Foo
:
Option
这种方法正确吗?
答案 0 :(得分:1)
是的,看起来不错
次要简化:有一张地图可以快速查找
val values = Seq(FooA, FooB)
val fastLookup = values.map(v => v.name -> v).toMap
def withName(name: String): Option[Foo] = fastLookup.get(name)
答案 1 :(得分:0)
beachape
有一个方便的库,可用于为您的sealed trait
提供枚举的某些功能
您需要包含在sbt中的软件包是:
"com.beachape" %% "enumeratum" % "1.5.15"
然后使用Enum
扩展对象,如下所示:
import enumeratum._
sealed trait Foo
object Foo extends Enum[Foo] {
case object FooA extends Foo
case object FooB extends Foo
}
您可以使用withName
函数(以及其他功能)来获取所需的密封特征:
Foo.withName("FooA")