如何避免长切换/大小写声明?

时间:2015-01-02 10:13:22

标签: java optimization

我有一个通用映射器类,其中有一个方法可以确定应该使用哪个转换器实现。这个指标是一个枚举。该方法如下所示:

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语句,但是在这里我必须返回一个类的实例,所以我认为它不会起作用。

我想我也无法提供变换器选择enum本身的信息,因为我必须将MapperClass作为参数提供给变换器实现。

但是我认为必须有一个解决方案来避免这么长的切换/案例陈述,即使在我的情况下,这些类有一个"不太好的"耦合。

2 个答案:

答案 0 :(得分:4)

您可以拥有以下内容:

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;
 }
}

然后获取枚举实例的变换器并执行解压缩

答案 1 :(得分:1)

如果您的变压器具有相同的合同(相同的方法),您可以实施工厂方法模式Check this link。此模式为添加更多功能提供了更大的灵活性