我有一个抽象类Entity
。每个扩展Entity
的类都需要一些默认设置和一些可自定义的设置:
public abstract class Entity {
protected Entity() {
// ... default setup
customSetup();
}
protected abstract void customSetup();
// ...
}
我的扩展类MyEntity
在构造函数中使用了一个参数,该参数将在customSetup()
中使用:
public class MyEntity extends Entity {
private Data data;
public MyEntity(Data d) {
super(); // in here customSetup() is called!
data = d;
}
@Override
protected void customSetup() {
codeDependingOn(data); // will throw NPE: data==null yet!
}
}
正如评论所述,此代码无效。
我可以扔掉customSetup()
并将所有自定义代码放在super()
之后,但是使用这种抽象方法会更清楚你应该放在那里。
我觉得我违反了一些OOP设计规则。做你想做的事的正确方法是什么?
答案 0 :(得分:9)
调用可以从构造函数覆盖的方法通常是一个坏主意。问题是该类尚未完全初始化,并且当在子类中调用该方法时,它可能会导致麻烦。
看一下这个问题:What's wrong with overridable method calls in constructors?,它有一个很好的解释。