You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 14:05:32