抽象类构造函数中的抽象方法:设计缺陷?

big*_*nes 8 java oop

我有一个抽象的课Entity.扩展的每个类Entity都需要一些默认设置和一些可自定义的设置:

public abstract class Entity {

    protected Entity() {
        // ... default setup
        customSetup();
    }

    protected abstract void customSetup();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我的扩展类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!
    }
}
Run Code Online (Sandbox Code Playgroud)

正如评论所述,此代码不起作用.

我可以扔掉customSetup()并放下所有自定义代码super(),但是使用那种抽象方法可以更清楚地说明你应该放在那里.

我觉得我违反了一些OOP设计规则.做我想要的正确方法是什么?

Mal*_*olm 9

调用可以从构造函数覆盖的方法通常是个坏主意.问题是该类尚未完全初始化,并且当在子类中调用该方法时,它可能会导致麻烦.

看看这个问题:构造函数中的可覆盖方法调用有什么问题,它有一个很好的解释.