如何在父类中统一处理子类私有成员并消除getX()实现冗余?
消除getX()冗余代码的可行方案
当然可以!我们完全能在保留两个子类x的不同实现逻辑(一个是实例私有变量、一个是静态私有变量且构造时自增)的前提下,消除重复的getX()代码。核心思路是把通用的取值逻辑抽离到父类,让子类只负责维护自己特有的x变量和取值方式。下面是两种具体实现方式:
方案1:抽象父类新增模板方法(兼容所有Java版本)
我们可以在父类里实现通用的getX(),同时新增一个抽象方法让子类提供具体的x取值逻辑。这样子类只需要实现这个抽象方法,不用重复写getX():
abstract class Parent { // 通用的getX逻辑,所有子类复用 int getX() { return provideXValue(); } // 子类必须实现这个方法,返回自己的x值 abstract int provideXValue(); } class AgnosticChild extends Parent { private int x = 5; @Override int provideXValue() { return x; } } class ManipulativeChild extends Parent { private static int x = 5; ManipulativeChild() { x++; } @Override int provideXValue() { return x; } }
这个方案的好处是兼容性强,不管是Java 8之前还是之后的版本都能用,而且逻辑清晰:父类管“怎么返回x”,子类管“x是什么”,完美保留了原有的变量特性——AgnosticChild每个实例有独立的x,ManipulativeChild所有实例共享静态x且构造时自增。
方案2:利用函数式接口简化(Java 8+)
如果你的项目用的是Java 8或更高版本,可以用Supplier函数式接口来进一步简化代码,子类甚至不需要写额外的方法,只用在构造时传递x的取值逻辑就行:
import java.util.function.Supplier; abstract class Parent { private final Supplier<Integer> xSupplier; // 父类通过构造函数接收x的取值逻辑 Parent(Supplier<Integer> xSupplier) { this.xSupplier = xSupplier; } int getX() { return xSupplier.get(); } } class AgnosticChild extends Parent { private int x = 5; AgnosticChild() { // 传递当前实例的x取值lambda super(() -> this.x); } } class ManipulativeChild extends Parent { private static int x = 5; ManipulativeChild() { super(() -> x); // 保持原有的构造时自增逻辑 x++; } }
这种方式更简洁,利用lambda表达式把子类的x取值逻辑直接传给父类,同样能保留所有原有的变量行为。
关键逻辑拆分
本质上我们是把代码拆成了两部分:
- 通用逻辑:
getX()只是返回x的值,这部分完全可以复用; - 特有逻辑:x是实例变量还是静态变量、初始化和修改规则,这部分是子类独有的,必须保留在子类中。
这样既消除了冗余代码,又没有改变原有的业务逻辑。
内容的提问来源于stack exchange,提问作者David Schneider
相关产品推荐
相关产品推荐

