Java如何实现if-else分支中availAmount的精准扣减
问题说明
我是Java开发新手,目前无法合理管控代码的分支执行与终止逻辑。现有一段实现配件升级金额扣减的if-else代码,当前逻辑会按顺序扣减可用金额availAmount,前序分支的扣减操作会直接修改availAmount的值,进而影响后续分支的判断结果,想要实现availAmount仅在指定的对应if分支中完成扣减,不会因为前序分支的金额扣减干扰后续配件的购买判断。
原有问题代码如下:
double upgradeAccessories(double availAmount) { if(availAmount>21500) { hasAC=true; availAmount-=21500; } else { hasAC=false; } if(availAmount>=14400) { hasLeatherSeats=true; availAmount-=14400; } else { hasLeatherSeats=false; } if(availAmount>=6250) { hasBackWipers=true; availAmount-=6250; } else { hasBackWipers=false; } if(availAmount>=3300) { hasFogLights=true; availAmount-=3300; } else { hasFogLights=false; } return availAmount; }
问题根因
原有代码所有分支判断、金额扣减逻辑都复用同一个可变的availAmount变量,前序分支一旦触发购买扣减,就会修改这个变量的存储值,后续所有分支的判断基准就变成了扣减后的剩余金额,而非最初传入的可用总金额,最终导致判断逻辑和预期不符。
修复方案
核心思路是把判断用的基准金额和扣减计算用的金额拆分为两个独立变量,全程不修改原始传入的总金额做判断:
- 用
final修饰的常量存储原始传入的可用总金额,所有配件的购买资格判断都基于这个固定值,从语法层面避免该值被中途误修改 - 单独定义一个变量累计所有选中配件的总花费,最后用原始总金额减去累计花费,得到最终剩余的可用金额
修复后代码参考:
double upgradeAccessories(double availAmount) { // 存储固定的原始总金额,作为所有配件购买判断的基准 final double totalAmount = availAmount; // 累计所有选中配件的总花费 double totalCost = 0; // 空调配件判断与成本累计 if(totalAmount > 21500) { hasAC = true; totalCost += 21500; } else { hasAC = false; } // 真皮座椅判断与成本累计,不受其他配件选择的影响 if(totalAmount >= 14400) { hasLeatherSeats = true; totalCost += 14400; } else { hasLeatherSeats = false; } // 后雨刷判断与成本累计 if(totalAmount >= 6250) { hasBackWipers = true; totalCost += 6250; } else { hasBackWipers = false; } // 雾灯判断与成本累计 if(totalAmount >= 3300) { hasFogLights = true; totalCost += 3300; } else { hasFogLights = false; } // 计算并返回最终剩余金额 return totalAmount - totalCost; }
补充说明
如果你的业务需求是「配件必须按给定优先级依次购买,余额不足以购买当前配件时,后续配件也无权购买」,那你原本顺序扣减的写法是符合要求的;只有当需求是「只要初始总金额满足单个配件的价格,就可以选中该配件,不受其他配件选择影响」时,才需要用上述拆分变量的方案。
内容的提问来源于stack exchange,提问作者John Cennon
相关产品推荐
相关产品推荐

