Scala密封特征-复制枚举withName方法

时间:2018-08-29 20:30:37

标签: scala

我正在尝试将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

这种方法正确吗?

2 个答案:

答案 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")