Java if-else 多重嵌套的优化

文章目录

  • 1. if-else 多重嵌套的问题
  • 2. 解决方案
      • 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;

}

你可能感兴趣的:(Java,基础)