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
相关产品推荐
相关产品推荐

