我正在尝试将一个Enumeration
重构为一个带具体类的密封特质,因为我需要在其中打包更多的功能。使用密封特质,我想要类似于Enumeration
的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)
方法作为Option
获取类型为Foo
的相应具体对象:
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) => print("Matched Foo.FooB!")
}
val testFooNoneName = "none"
val testFooNone = Foo.withName(testFooNoneName) // Will yield None
Output:
Matched Foo.FooA!
这种方法正确吗?
withName
方法设置一个私有的Map
。此外,这似乎可以属于Code Review Stack Exchange。 - Andrey Tyukinvalues.find(_.name == name)
。我们需要一组字符串来直接进行比较。 - Nagarjuna Pamuname match {...}
并返回其中一个对象来避免额外的空间开销。 - aiguy