Scala 斯卡拉“;“工厂”;从字符串创建案例对象的设计模式

Scala 斯卡拉“;“工厂”;从字符串创建案例对象的设计模式,scala,traits,case-class,Scala,Traits,Case Class,我是scala新手,正在寻找“scala”方法来创建由外部源从字符串枚举获取的正确案例类(符合特征)。由于源是外部的,因此应该对输入是否正确进行一些验证,并且给定的有效输入将返回正确的case类。我假设这是一个“工厂”,返回给定特征的可选case类 例如: trait ProcessingMechanism case object PMv1 extends ProcessingMechanism case object PMv2 extends ProcessingMechanism case

我是scala新手,正在寻找“scala”方法来创建由外部源从字符串枚举获取的正确案例类(符合特征)。由于源是外部的,因此应该对输入是否正确进行一些验证,并且给定的有效输入将返回正确的case类。我假设这是一个“工厂”,返回给定特征的可选case类

例如:

trait ProcessingMechanism
case object PMv1 extends ProcessingMechanism
case object PMv2 extends ProcessingMechanism
case object PMv3 extends ProcessingMechanism
...
...
我希望有一个工厂返回正确的处理机制

i、 e


不必求助于宏或外部库,您可以做如下简单的事情:

object ProcessingMechanism {
  def unapply(str: String): Option[ProcessingMechanism] = str match {
    case "V1" => Some(PMv1)
    case "V2" => Some(PMv2)
    // ...
    case _ => None
  }
}

// to use it:
def methodAcceptingExternalInput(processingMethod: String) = processingMethod match {
  case ProcessingMethod(pm) => // do something with pm whose type is ProcessingMethod
}
// or simply:
val ProcessingMethod(pm) = externalString

正如在对问题的评论中所建议的那样,最好将特征标记为
sealed

如果您有
sealed trait
,您可以使用该问题可能会有所帮助。如果你正在寻找一个图书馆,它可能是当今最流行的。
object ProcessingMechanism {
  def unapply(str: String): Option[ProcessingMechanism] = str match {
    case "V1" => Some(PMv1)
    case "V2" => Some(PMv2)
    // ...
    case _ => None
  }
}

// to use it:
def methodAcceptingExternalInput(processingMethod: String) = processingMethod match {
  case ProcessingMethod(pm) => // do something with pm whose type is ProcessingMethod
}
// or simply:
val ProcessingMethod(pm) = externalString