如何无需实例化子类即可调用抽象类中所有子类共有的方法
重构方案
你可以根据自己的项目Java版本、代码规范选择以下任意一种方案,都可以实现不实例化策略子类直接调用getSomething公共方法:
方案1:抽公共静态工具类(全版本兼容)
把AbstractStrategy中getSomething的公共逻辑抽为独立静态工具方法,所有需要调用的地方直接引用即可,不需要实例化任何对象:
// 新增公共工具类 public class StrategyCommonUtils { // 静态方法,直接类名调用 public static Object getSomething() { // 原有公共逻辑 } } // 原有抽象类保持兼容,直接调用工具类 abstract class AbstractStrategy implements Strategy { @Override public Object getSomething() { return StrategyCommonUtils.getSomething(); } } // ContractImpl直接调用工具类即可 class ContractImpl implements Contract { // 其他方法保持不变 @Override public Object getSomething() { return StrategyCommonUtils.getSomething(); } }
方案2:使用Java 8+接口默认/静态方法
如果项目用Java 8及以上版本,可以直接把公共逻辑放到Strategy接口的默认方法或者静态方法中,甚至可以直接删掉多余的抽象类:
interface Strategy { void createSomething(); void updateSomething(); // 静态方法,无需实例化直接调用 static Object getSomethingCommon() { // 公共逻辑 } // 也可以写默认方法,子类不需要重复实现 default Object getSomething() { return getSomethingCommon(); } } // 子类只需要实现两个非公共方法,不需要重写getSomething class StrategyA implements Strategy { @Override public void createSomething() {...} @Override public void updateSomething() {...} } // ContractImpl直接调用接口静态方法 class ContractImpl implements Contract { @Override public Object getSomething() { return Strategy.getSomethingCommon(); } }
方案3:拆分接口优化结构(可选搭配前两种方案)
你现在的Contract和Strategy两个接口方法完全重复,可以按职责拆分接口,逻辑更清晰,也避免重复定义:
// 公共读接口,放公共逻辑 interface ReadableService { Object getSomething(); } // 写接口,放差异化方法 interface WritableService { void createSomething(); void updateSomething(); } // Strategy和Contract都继承拆分后的接口,不需要重复写方法定义 interface Strategy extends ReadableService, WritableService {} interface Contract extends ReadableService, WritableService {}
内容的提问来源于stack exchange,提问作者Mister Mow
相关产品推荐
相关产品推荐

