java - 结合 if 子句重构 big switch case
问题描述
所以我有这样的事情:
switch (data){
case "one" :
if (version1)
createDataOneV1();
else
createDataOnetV2();
break;
case "two":
if(version1)
createDataTwoV1();
else
createDataTwoV2();
break;
default:
createDefaultData();
}
有很多(开关)案例。有什么重构的建议吗?
解决方案
不要使用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);
}
推荐阅读
- angular - 在输入中打印 JSON 数据,角度
- jq - JQ如何将数组加入一行?
- spring-boot - log.error() 没有记录严重性错误,而是记录信息
- android - 程序多次执行一行代码
- php - 为 eloquent 模型添加属性
- django - Django Admin中没有对象实例的内联操作
- python - 如何将字符串分割成嵌套列表中的单个字符
- java - 尝试从 SQLite DB 设置 checkedtextview 时出错
- asp.net-core-2.0 - 如何在 asp.net 核心框架中使用 DocuSign 对文档进行数字签名
- r - 从 R 中的异常库运行 time_decompose 函数时收到错误消息