Абстрактные методы в конструкторе абстрактного класса: недостаток конструкции?

У меня есть абстрактный класс 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 () , но наличие этого абстрактного метода проясняет то, что вы должны туда поместить.

Мне кажется, что я нарушаю какое-то правило ООП-дизайна. Как правильно делать то, что я хочу?

8
задан bigstones 20 October 2011 в 18:05
поделиться