代码之家  ›  专栏  ›  技术社区  ›  Avba

用于从字符串创建case对象的scala“工厂”设计模式

  •  1
  • Avba  · 技术社区  · 7 年前

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

    例子:

    trait ProcessingMechanism
    case object PMv1 extends ProcessingMechanism
    case object PMv2 extends ProcessingMechanism
    case object PMv3 extends ProcessingMechanism
    ...
    ...
    

    我想让工厂退回正确的处理机制

    object ProcessingMechanismFactory {
       ... switch on the input string to return the correct mechanism???
       ... is there a simple way to do this?
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Hosam Aly    7 年前

    无需求助于宏或外部库,您可以执行以下简单操作:

    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 .