Java if-else 多重嵌套的优化

妖狐艹你老母 2023-10-08 11:27 42阅读 0赞

文章目录

    1. if-else 多重嵌套的问题
    1. 解决方案
      • 2.1 使用 Map 缓存
      • 2.2 switch 简化条件

1. if-else 多重嵌套的问题

项目重构发现代码中存在类似以下的三重 if-else 嵌套代码,其中变量 a、b、c有三种可能的取值,组合起来共有27 个分支,这还没有算上对各个变量进行合法性校验失败的分支。如此繁杂琐碎的代码阅读起来有多费劲可想而知,而条件判断太多对理解业务逻辑也是个问题,更不用提之后的扩展维护

  1. if (a == 1) {
  2. if (b == 1) {
  3. if (c == 1) {
  4. } else if (c == 2) {
  5. } else if (c == 3) {
  6. } else {
  7. }
  8. } else if (b == 2) {
  9. }
  10. ......
  11. } else if (a == 2) {
  12. ......
  13. }

2. 解决方案

条件判断嵌套过多的害处毋庸多言,仔细思索后大致整理了优化思路,首要点是将多重条件判断进行整合。如以上例子中对 3 个变量的取值逐一判断来确定一条分支其实可以优化为以 3 个变量聚合为一个条件进行分支确定,这样分支数并不会减少,但是对条件的判断必然是更为清晰的

2.1 使用 Map 缓存

基于以上例子,变量 a、b、c都是整数类型的数据,则可以考虑将其合并为一个String 数据,以字符串”111” 来表示 a=1, b=1, c=1 的条件,这样可以用一个 Map 结构来存储对应操作标识,从而实现策略切换。这种方式通常会另外新建一个工具类,通过工具类来获取对应条件的结果

  1. public static Map<String, MatchVerifyResultDTO> getInstance() {
  2. if (upCreditMap.isEmpty()) {
  3. MatchVerifyResultDTO invalidResult = new MatchVerifyResultDTO(false,
  4. MatchVerifyEnum.MVC_UP_CREDIT_ERR.getCode());
  5. MatchVerifyResultDTO validResult = new MatchVerifyResultDTO(true, MatchVerifyEnum.MVC_PASS.getCode());
  6. upCreditMap.put("111", invalidResult);
  7. upCreditMap.put("112", validResult);
  8. upCreditMap.put("113", validResult);
  9. ......
  10. }
  11. return upCreditMap;
  12. }

2.2 switch 简化条件

如果不准备新建工具类来实现条件简化,也可以采用 switch结构。不过不管何种方式,核心思想是不变的,即采用整体数据来消弭小的差异判断,此处依然将变量 a、b、c合并为一个String 特征条件

  1. switch(attribute) {
  2. case "111":
  3. case "112":
  4. handleTargetMessage();
  5. break;
  6. ......
  7. default:
  8. log.error("Not supported attribute!")
  9. break;
  10. }

发表评论

表情:
评论列表 (有 0 条评论,42人围观)

还没有评论,来说两句吧...

相关阅读

    相关 mvc多重嵌套参数提交和封装

    项目中经常遇到需要提交多重集合参数的提交问题,今天分享下这样一个场景:前台页面提交多个商品的属性而每个属性又对应多个属性值。这就涉及多个嵌套对象的参数提交问题。下面我们来一步一

    相关 多重循环优化

    > 四平方和 (程序设计) > 四平方和定理,又称为拉格朗日定理: > 每个正整数都可以表示为至多4个正整数的平方和。 > 如果把0包括进去,就正好可以表示为4个数

    相关 java跳出多重嵌套循环

    在java里面,我们知道有goto这个关键字,但是实际却没有啥作用,这就让我们不像在c/c++里面能够随便让程序跳到那去执行,而break只能跳出当前的一个循环语句,如果要跳出