if-else与switch选型咨询:抽象类子类重写方法优化方案
代码优化方案选择与改进建议
先直接说结论:你给出的两种实现都存在冗余代码,更推荐用配置化的方式重构,比这两种方案更简洁、易维护。下面具体分析:
现有两种实现的问题与简化
不管是if-else还是switch版本,都有没必要的冗余:比如每个分支都先赋值result再return,完全可以直接返回布尔表达式结果;而且原逻辑里CLERICAL类型不管cost是否小于500,最终都会返回false,这个分支可以直接简化。
简化后的if-else版本
protected boolean canApprove(int id, double cost, Type type) { if (type == Type.CONSUMABLES) { return cost < 300; } else if (type == Type.CLERICAL) { return false; // 原逻辑下该类型永远不通过 } else if (type == Type.GADGETS) { return cost < 1000; } else if (type == Type.GAMING) { return cost < 2000; } else if (type == Type.PC) { return cost < 5000; } return false; }
简化后的switch版本(Java 12+)
protected boolean canApprove(int id, double cost, Type type) { return switch (type) { case CONSUMABLES -> cost < 300; case CLERICAL -> false; case GADGETS -> cost < 1000; case GAMING -> cost < 2000; case PC -> cost < 5000; default -> false; }; }
更优的配置化重构方案
因为你有4个继承抽象类的子类,每个子类的审批规则可能不同,用配置化的方式可以把规则和逻辑分离,后续修改阈值或新增类型时,只需要调整配置,不用改判断逻辑。
以其中一个子类为例:
// 子类中定义审批阈值配置 private static final Map<Type, Double> APPROVAL_THRESHOLDS = Map.of( Type.CONSUMABLES, 300.0, Type.GADGETS, 1000.0, Type.GAMING, 2000.0, Type.PC, 5000.0 ); @Override protected boolean canApprove(int id, double cost, Type type) { // 特殊处理CLERICAL类型 if (Type.CLERICAL == type) { return false; } // 从配置中取阈值判断 Double threshold = APPROVAL_THRESHOLDS.get(type); return threshold != null && cost < threshold; }
如果后续需要给某个子类新增Type规则,只需要在APPROVAL_THRESHOLDS里加一行键值对即可;如果要修改阈值,直接改数字就行,代码可读性和维护性都比前两种方案强。
另外注意:原代码中的id参数没有被使用,如果是业务遗漏,记得补充对应的逻辑。
内容的提问来源于stack exchange,提问作者user20341414
相关产品推荐
相关产品推荐

