Java中抽离公共方法后如何识别调用方以执行对应send方法
问题解答
关于是否需要使用instanceof
完全不需要使用instanceof做类型判断,这种实现方式不仅冗余,还违反开闭原则,后续新增同类型业务类时,必须修改工具类的判断逻辑,维护成本极高。
更优的实现方案
根据你的业务场景,推荐两种适配性较高的实现方式:
方案1:抽象父类提取公共逻辑(优先推荐)
如果A、B没有其他必须继承的父类,直接用抽象基类收拢公共方法是最简洁的方案:
- 定义抽象父类,把重复的
myMethod()逻辑直接放到父类中,将差异化的send()定义为抽象方法 - A、B分别继承抽象父类,各自实现自身的
send()逻辑即可
代码示例:
abstract class BaseSender { // 公共逻辑统一维护,子类无需重复实现 public String myMethod(){ // do-something 所有子类通用的逻辑都放在这里 return send(); } // 抽象方法,强制子类实现差异化的发送逻辑 public abstract String send(); } class A extends BaseSender { @Override public String send(){ // 实现A类专属的发送逻辑 } } class B extends BaseSender { @Override public String send(){ // 实现B类专属的发送逻辑 } }
使用方式和原来完全一致,直接调用对应类实例的myMethod()即可:
new A().myMethod(); // 自动执行A的send逻辑 new B().myMethod(); // 自动执行B的send逻辑
方案2:接口+工具类实现(适配有继承限制的场景)
如果A、B已经继承了其他父类,受Java单继承限制无法再继承抽象类,可以用接口配合工具类实现:
- 定义公共接口,声明
send()方法规范 - A、B分别实现该接口,完成各自的
send()逻辑 - 工具类的
myMethod()接收接口类型作为入参,直接调用入参的send()方法
代码示例:
// 定义发送行为接口 public interface Sendable { String send(); } // A类实现接口 class A implements Sendable { @Override public String send(){ // A类专属发送逻辑 } } // B类实现接口 class B implements Sendable { @Override public String send(){ // B类专属发送逻辑 } } // 工具类实现 class Util { // 入参直接接收接口类型,无需判断具体实现类 public static String myMethod(Sendable sender){ // do-something 公共逻辑 return sender.send(); } }
使用方式如下:
Util.myMethod(new A()); // 执行A的send逻辑 Util.myMethod(new B()); // 执行B的send逻辑
两种方案都完全避免了类型判断,后续新增业务类时只需要继承抽象父类或者实现对应接口即可,无需修改原有公共逻辑代码,可维护性和扩展性都远高于instanceof判断的实现。
内容的提问来源于stack exchange,提问作者Som
相关产品推荐
相关产品推荐

