无继承相似类重复代码规避及同名方法实现方案咨询
嘿,这个场景太常见了!咱们直接上几个靠谱的方案,帮你彻底干掉重复代码:
方案一:定义公共接口(最优解,符合面向对象设计)
既然Fish、Plant还有Dog都有逻辑一致的isAlive()方法,那咱们可以给它们抽象出一个公共的行为接口,让这些类都实现它——完全不用修改原有isAlive()的实现逻辑,只是加个接口声明就行。
// 第一步:定义一个描述"有生命"行为的接口 interface LivingBeing { boolean isAlive(); } // 第二步:让现有类实现这个接口(原有逻辑丝毫不改) class Fish implements LivingBeing { // 你的原有isAlive()代码保持不变 public boolean isAlive() { // 比如 return this.health > 0; } } class Plant implements LivingBeing { public boolean isAlive() { // 和Fish一模一样的逻辑,不用改 } } class Dog implements LivingBeing { public boolean isAlive() { // 同理 } } // 第三步:写一个通用的泛型方法,处理所有实现了LivingBeing的列表 public <T extends LivingBeing> void removeDeadIndividuals(List<T> livingBeings) { // 直接用Java 8+的removeIf,一行搞定移除逻辑 livingBeings.removeIf(being -> !being.isAlive()); }
这样你调用的时候,不管传的是List<Fish>、List<Plant>还是List<Dog>,都用同一个removeDeadIndividuals方法,完全不用加额外参数,重复代码也彻底消失了。而且以后再新增类似的类,只要实现LivingBeing接口,这个方法自动就能支持,完美符合开闭原则。
方案二:静态工具类(如果不能修改原有类的情况)
要是你没法修改Fish、Plant这些类的代码(比如是第三方库的类),那可以用静态工具类配合方法引用,虽然会多传一个参数,但能避免重复的移除逻辑:
public class LifeCycleUtils { public static <T> void removeDead(List<T> list, Predicate<T> isAliveChecker) { list.removeIf(isAliveChecker.negate()); } } // 调用的时候用方法引用,代码依然简洁 LifeCycleUtils.removeDead(fishList, Fish::isAlive); LifeCycleUtils.removeDead(dogList, Dog::isAlive);
不过这个方案需要多传一个参数,如果你严格不想加方法签名参数,那方案一还是首选。
为啥不推荐其他方式?
- 直接写多个重载方法(比如
removeDead(List<Fish>)、removeDead(List<Dog>)):本质还是复制粘贴代码,违背了DRY原则,维护起来头疼。 - 反射:虽然能绕过类型检查,但性能差、代码可读性低,还容易出运行时错误,完全没必要。
内容的提问来源于stack exchange,提问作者kluo
相关产品推荐
相关产品推荐

