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

Java枚举中多常量重写抽象方法存在重复代码如何优化

解决Java枚举常量重复实现方法的可行方案

下面提供3种落地性强的改造方式,都不需要合并A、B两个枚举常量:

方案1:抽取公共逻辑到枚举类的私有静态方法(推荐,改动最小)

优先选择该方案,改动成本最低,且兼容后续业务逻辑变更,如果后续A、B的逻辑又要差异化,直接把方法调用换回各自的实现即可。
直接把A、B重复的代码提取成枚举类内部的私有静态工具方法,A和B的实现直接调用这个方法即可:

public enum DP {
    A {
        @Override
        public void someMethod(){
            commonMethodForAB();
        }
    },
    B {
        @Override
        public void someMethod(){
            commonMethodForAB();
        }
    },
    C {
        @Override
        public void someMethod(){
            // C的独立逻辑
        }
    };

    public abstract void someMethod();
    // 抽取A、B共用的逻辑
    private static void commonMethodForAB() {
        // 原来的重复代码
    }
}

方案2:用策略模式注入方法实现(适合后续可能扩展更多同实现枚举的场景)

如果后续可能新增更多和A、B逻辑一致的枚举常量,可以在枚举构造函数里传入函数式接口作为方法的实现,省略每个常量的重写模板代码:

public enum DP {
    A(DP::commonMethodForAB),
    B(DP::commonMethodForAB),
    C(() -> {
        // C的独立逻辑
    });

    private final Runnable someMethodImpl;

    DP(Runnable someMethodImpl) {
        this.someMethodImpl = someMethodImpl;
    }

    public void someMethod() {
        someMethodImpl.run();
    }

    private static void commonMethodForAB() {
        // 原来的重复代码
    }
}

如果someMethod需要传参或者有返回值,把Runnable替换为对应入参、返回值的函数式接口即可。

方案3:改造抽象方法为普通方法,分支判断逻辑(适合枚举值固定的场景)

如果枚举值数量不多,且后续基本不会新增枚举常量,可以把抽象方法改成普通实现,内部判断当前枚举实例走对应逻辑:

public enum DP {
    A, B, C;

    public void someMethod(){
        if (this == A || this == B) {
            // A、B共用的逻辑
        } else if (this == C) {
            // C的独立逻辑
        }
    }
}

该方案完全消除了重写的模板代码,缺点是后续新增枚举值时容易漏加判断分支。

内容的提问来源于stack exchange,提问作者kimsbrian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 13:27:00