我有一个抽象课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设计的某些规则。做我想做的正确方法是什么?
调用可以从构造函数中覆盖的方法通常是一个坏主意。问题在于该类尚未完全初始化,并且在子类中调用该方法时,可能会引起麻烦。
看一下这个问题:构造函数中可重写的方法调用出了什么问题?,它有很好的解释。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句