Вызов метода суперкласса автоматически

Рассмотрим следующий класс

class A{
    public void init(){
        //do this first;
    }
    public void atEnd(){
        //do this after init of base class ends
    }
}

class B1 extends A{

    @Override
    public void init()
    {
        super.init();
        //do new stuff.
        //I do not want to call atEnd() method here...
    }
}

У меня есть несколько дочерних классов B1, B2,... Bn, которые уже разработаны. Все они расширяют класс A. Если я хочу добавить новую функциональность во всех них, лучшим местом для этого является определение этого метода в классе A. Но условие состоит в том, что метод всегда должен вызываться автоматически непосредственно перед метод init() дочернего класса заканчивается. Один из основных способов сделать это - снова добавить вызов метода atEnd() в конце метода init() дочерних классов. Но есть ли другой способ сделать это с умом?

Ответ 1

Один из способов сделать это - сделать init() final и делегировать его операцию второму, overridable, method:

abstract class A {
  public final void init() {
    // insert prologue here
    initImpl();
    // insert epilogue here
  }
  protected abstract void initImpl();
}

class B extends A {
  protected void initImpl() {
    // ...
  }
}

Всякий раз, когда кто-либо звонит init(), пролог и эпилог выполняются автоматически, а производным классам ничего не нужно делать.

Ответ 2

Другая мысль заключалась бы в том, чтобы сплести в одном аспекте. Добавьте до и после указания pointcut.

Ответ 3

Сделайте init() final и предоставите отдельный метод, чтобы люди могли переопределять вызовы init() в середине:

class A{
    public final void init(){
        //do this first;
    }

    protected void initCore() { }

    public void atEnd(){
        //do this after init of base class ends
    }
}

class B1 extends A{

    @Override
    protected void initCore()
    {
        //do new stuff.
    }
}