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

时间:2011-10-20 17:37:29

标签: java oop

我有一个抽象类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设计规则。做你想做的事的正确方法是什么?

1 个答案:

答案 0 :(得分:9)

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

看一下这个问题:What's wrong with overridable method calls in constructors?,它有一个很好的解释。