如何合并Java中实现逻辑相同但参数类型不同的两个方法
优化方案
场景1:BaseStudent是NbdStudent的父类
直接删除参数类型为NbdStudent的重载方法即可,父类类型的参数可以直接接收子类实例,原有调用逻辑完全不需要改动:
// 仅保留这一个方法即可同时适配两种入参 private static void updateName(BaseStudent student) { student.setName("update base"); }
场景2:两个类无继承关系
优先通过抽取公共接口+多态的方式消除重复代码:
- 定义包含公共
setName方法的接口:
public interface Student { void setName(String name); }
- 让两个类都实现该接口,原有类的内部逻辑不需要改动:
public class BaseStudent implements Student { private String name; @Override public void setName(String name) { this.name = name; } // 其他原有逻辑保持不变 } public class NbdStudent implements Student { private String name; @Override public void setName(String name) { this.name = name; } // 其他原有逻辑保持不变 }
- 合并重复的
updateName方法,入参改为接口类型:
private static void updateName(Student student) { student.setName("update base"); }
备选方案(不改动原有类结构)
如果没有权限修改两个Student类的定义,可以通过抽取公共逻辑+函数式接口的方式消除重复:
import java.util.function.Consumer; public class Main { public static void main(String[] args) { BaseStudent baseStudent = new BaseStudent(); baseStudent.setName("base"); NbdStudent nbdStudent = new NbdStudent(); nbdStudent.setName("nbd"); updateName(baseStudent); updateName(nbdStudent); } private static void updateName(BaseStudent student) { commonUpdate(student::setName); } private static void updateName(NbdStudent student) { commonUpdate(student::setName); } // 所有公共逻辑都放在这里统一维护 private static void commonUpdate(Consumer<String> nameSetter) { nameSetter.accept("update base"); } }
内容的提问来源于stack exchange,提问作者sunnyc
相关产品推荐
相关产品推荐

