来自()方法的通用密封特征



考虑以下代码:

sealed trait Foo {
  def name: String
}
case object FooA extends Foo {
  override val name: String = "a"
}
case object FooB extends Foo {
  override val name: String = "b"
}
object Foo {
  def fromString(name: String): Foo = {
    name match {
     case FooA.name => FooA
     case FooB.name => FooB  
  }
}

我可以从string((方法重构以避免每个案例对象实例的情况吗?一些可以通过所有FOO实例枚举的更多通用代码?

在我的真实版本中,我开始有很多案例对象,而case bla.name => bla的墙很无聊^^

谢谢:(

beachape提供一个枚举库,可以为您提供此功能:

将其包括在您的build.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")

这样的事情怎么样?

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

val testFooAName = "a"
val testFooA = Foo.withName(testFooAName) // Will yield Some(FooA)
testFooA match {
    case Some(Foo.FooA) => println("Matched Foo.FooA!")
    case Some(Foo.FooB) => println("Matched Foo.FooB!")
}
val testFooNoneName = "none"
val testFooNone = Foo.withName(testFooNoneName) // Will yield None
Output:
Matched Foo.FooA!

最新更新