首页 > 解决方案 > 结合 if 子句重构 big switch case

问题描述

所以我有这样的事情:

switch (data){
    case "one" :
        if (version1) 
            createDataOneV1();
         else 
             createDataOnetV2();
         break;
    case "two":
        if(version1)
            createDataTwoV1();
        else 
            createDataTwoV2();
        break;
    default:
        createDefaultData();
}

有很多(开关)案例。有什么重构的建议吗?

标签: javajava-8switch-statementrefactoring

解决方案


不要使用Map. 它不会为您提供与您相同的编译时安全性switch

如果您仍然想摆脱它,那么我建议您使用enum

public enum DataCreationStrategy {

    ONE("one", DataCreator::createDataOneV1, DataCreator::createDataOneV2),
    TWO("two", DataCreator::createDataTwoV1, DataCreator::createDataTwoV2)
    // ... other cases
    ;

    private final String key;
    private final Function<DataCreator, String> creator;
    private final Function<DataCreator, String> defaultCreator;

    DataCreationStrategy(String key, Function<DataCreator, String> creator, Function<DataCreator, String> defaultCreator) {
        this.key = key;
        this.creator = creator;
        this.defaultCreator = defaultCreator;
    }

    public static Function<DataCreator, String> of(String key, boolean flag) {
        for (DataCreationStrategy strategy: values()){
            if(strategy.key.equals(key)){
                return flag ? strategy.creator : strategy.defaultCreator;
            }
        }
        return DataCreator::createDefaultData;
    }

}

然后像这样使用它:

String createdData = DataCreationStrategy.of(key, versionFlag).apply(creator);

(您可以替换String为您需要生成的实际数据类型)


of方法也可以以 Stream API 方式实现。但是在这种特殊情况下,普通的旧 for 循环要干净得多。

public static Function<DataCreator, String> of(String key, boolean flag) {
   return Arrays.stream(values())
                .filter(s -> s.key.equals(key))
                .findAny()
                .map(s -> flag ? flag ? s.creator : s.defaultCreator )
                .orElse(DataCreator::createDefaultData);
}

推荐阅读