如何避免长 switch/case 语句?

How can I avoid long switch/case statement?

我有一个通用映射器 class,它具有确定应使用哪个转换器实现的方法。这个指标是一个枚举。该方法如下所示:

private void test() throws Exception {
    MyEnum nameEnum = ...
    ITransformer myTransformer;
    switch (nameEnum) {
    case ENUM1:
        mytransformer= new TransformerImpl1(this);
        mytransformer.doUnmarshal();
        break;
    case ENUM2:
        mytransformer= new TransformerImpl2(this);
        mytransformer.doUnmarshal();
        break;
    case ENUM3:
        mytransformer= new TransformerImpl3(this);
        mytransformer.doUnmarshal();
        break;
    ...// 40 x
    }
}

我知道如何填充静态地图来避免这样的 switch/case 语句,但在这里我必须 return 一个 class 的实例,所以我认为这行不通.

我想我也不能将选择哪个转换器的信息提供给枚举本身,因为我必须将 MapperClass 作为参数提供给转换器实现。

但我认为必须有一个解决方案来避免这么长的 switch/case 语句,即使在我的情况下 classes 有一个 "not so good" 耦合。

你可以有这样的东西:

public enum MyEnum {

 ENUM1(new TransformerImpl1()),
 ENUM2(new TransformerImpl2()),
 ENUM3(new TransformerImpl3()),
 ENUM4(new TransformerImpl4());

 ITransformer myTransformer;
 MyEnum(ITransformer myTransformer){
      this.myTransformer=myTransformer;
 }
 public ITransformer getTransformer() {
       return this.myTransformer;
 }
}

然后获取枚举实例的transformer并进行unmarchalling

如果你的转换器有相同的契约(相同的方法),你可以实现工厂方法模式Check this link。这种模式提供了更多的灵活性来添加更多的功能