Специальный метод должен вызываться после любого выполнения AbstractAction

Пожалуйста, извините за неопределенный заголовок вопроса, но обычно я не делаю такого рода вещи. Итак, у меня есть следующая проблема:

Я разрабатываю всплывающее меню для конкретного приложения, в котором каждый пункт меню связан с определенным действием:

public class CanvasMenu extends JPopupMenu {        
    public CanvasMenu(){
       this.add(new AbstractAction("Do some operation") {
           @Override
           public void actionPerformed(ActionEvent arg0) {
                doSomeStuff1();
                cleanup(); // has to be done after every menu operation
           }
    });

        this.add(new AbstractAction("Other operation") {
            @Override
            public void actionPerformed(ActionEvent e) {
                doSomeOtherStuff();
                cleanup(); // has to be done after every menu operation
            }
        });
    }
}

Я где-то читал, что AbstractAction используется для таких задач, где вы хотите добавить пункты меню и связать их с каким-либо действием. На самом деле я хочу не только два таких действия, но и несколько десятков из них.

Проблема заключается в cleanup вещь. cleanup должно быть после того, как любое из этих действий было выбрано. Это означает, что если я продолжу описанным выше образом, мне придется написать cleanup() для каждого AbstractAction,

Есть ли какой-либо (простой / элегантный / красивый) способ или шаблон, чтобы избежать написания cleanup() снова и снова? Т.е. возможно ли придумать что-то, что получит только действие, и после его выполнения автоматически вызовет cleanup?

1 ответ

Решение

Это один из шаблонов:

abstract class ActionWithCleanup extend AbstractAction {
       @Override
       public final void actionPerformed(ActionEvent arg0) {
            myAction();
            cleanup(); // has to be done after every menu operation
       }

       public abstract void myAction();
}

...

this.add(new ActionWithCleanup("Do some operation") {
       @Override
       public void myAction() {
            doSomeStuff1();
       }
});
Другие вопросы по тегам