我有一个必须扩展且无法更改的父类。父类遵循从其构造函数调用非最终/可重写方法的有点不好的做法。必须在我的子类中重写这些方法之一,但在父构造函数调用期间必须绕过子类代码。
此外,实例在实例化后必须完全可用,即静态工厂方法不是一个选项。
编辑:我最初制作了重写方法
protected
,但实际上它是有效的public
,因为有公共方法引用它。所以我编辑了这个例子以将其公开。结果是 Child 类必须重写该方法。如果没有覆盖,它将无法运行。
public class Parent {
Parent() {
parentMethod();
}
public void parentMethod() {
//parent stuff
}
}
public class Child extends Parent {
Object someObject;
Child () {
someObject = //some setup
}
@Override
public void parentMethod() {
//someObject does not exist here when parent calls it
someObject.doMyStuffInsteadOfParentStuff();
}
}
据我所知,没有简单的方法可以避免这种情况。我无法更改父类,并且子类必须使用需要通过默认构造函数进行简单实例化的 API。
我能想到的最好的计划是在重写的方法中测试子类初始化。通过使用默认为 false 的布尔值,或检查对象引用是否为 null。这两者都依赖于 Java 的内部默认初始化逻辑,理论上,这可能会以令人困惑的方式改变和破坏我的代码(尽管我发现这种可能性极不可能)。 例如类似的东西
@Override
protected void parentMethod() {
//check null or check some primitive boolean
if(someObject == null) super.parentMethod();
else someObject.doMyStuffInsteadOfParentStuff();
}
还有其他选择吗?如果不是,应该首选哪个选项(布尔检查与空检查)?
parentMethod()
。
我认为更好的方法是用委托代替继承。史密斯。像这样:class Parent {
Parent() {
/**
* Actually, this is a Bad Practice to call not
* static method from the constructor
*/
parentMethod();
}
protected void parentMethod() {}
}
class Child extends Parent {
private final Parent delegate;
private final Object someObject;
public Child(Parent delegate) {
this.delegate = delegate;
someObject = new Object();
someObject.doMyStaffInseadOfParentSuff();
}
}