Java if-else 多重嵌套的优化
文章目录
- if-else 多重嵌套的问题
- 解决方案
- 2.1 使用 Map 缓存
- 2.2 switch 简化条件
1. if-else 多重嵌套的问题
项目重构发现代码中存在类似以下的三重 if-else 嵌套代码,其中变量 a、b、c
有三种可能的取值,组合起来共有27 个分支,这还没有算上对各个变量进行合法性校验失败的分支。如此繁杂琐碎的代码阅读起来有多费劲可想而知,而条件判断太多对理解业务逻辑也是个问题,更不用提之后的扩展维护
if (a == 1) {
if (b == 1) {
if (c == 1) {
} else if (c == 2) {
} else if (c == 3) {
} else {
}
} else if (b == 2) {
}
......
} else if (a == 2) {
......
}
2. 解决方案
条件判断嵌套过多的害处毋庸多言,仔细思索后大致整理了优化思路,首要点是将多重条件判断进行整合。如以上例子中对 3 个变量的取值逐一判断来确定一条分支其实可以优化为以 3 个变量聚合为一个条件进行分支确定
,这样分支数并不会减少,但是对条件的判断必然是更为清晰的
2.1 使用 Map 缓存
基于以上例子,变量 a、b、c
都是整数类型的数据,则可以考虑将其合并为一个String
数据,以字符串”111” 来表示 a=1, b=1, c=1
的条件,这样可以用一个 Map
结构来存储对应操作标识,从而实现策略切换。这种方式通常会另外新建一个工具类,通过工具类来获取对应条件的结果
public static Map<String, MatchVerifyResultDTO> getInstance() {
if (upCreditMap.isEmpty()) {
MatchVerifyResultDTO invalidResult = new MatchVerifyResultDTO(false,
MatchVerifyEnum.MVC_UP_CREDIT_ERR.getCode());
MatchVerifyResultDTO validResult = new MatchVerifyResultDTO(true, MatchVerifyEnum.MVC_PASS.getCode());
upCreditMap.put("111", invalidResult);
upCreditMap.put("112", validResult);
upCreditMap.put("113", validResult);
......
}
return upCreditMap;
}
2.2 switch 简化条件
如果不准备新建工具类来实现条件简化,也可以采用 switch
结构。不过不管何种方式,核心思想是不变的,即采用整体数据来消弭小的差异判断,此处依然将变量 a、b、c
合并为一个String
特征条件
switch(attribute) {
case "111":
case "112":
handleTargetMessage();
break;
......
default:
log.error("Not supported attribute!")
break;
}
还没有评论,来说两句吧...