Должен ли ваш класс реализовать ActionListener или использовать объект анонимного класса ActionListener

Каков наилучший способ реализации java.awt.event.ActionListener интерфейс?

Пусть ваш класс реализует ActionListener и добавьте его как ActionListener:

class Foo implements ActionListener{

    public Foo() {
        JButton button = new JButton();
        button.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {

    }
}

Или добавьте объект анонимного класса ActionListener:

class Foo{

    public Foo() {
        JButton button = new JButton();
        button.addActionListener(new ActionListener() {     
            public void actionPerformed(ActionEvent e) {

            }
        });
    }
}

3 ответа

Решение

Некоторые (jeanette/kleopatra) говорят, что они почти никогда не используют ActionListener, а вместо этого используют такие действия, как AbstractAction. Почти всегда плохой идеал, чтобы ваш GUI-класс реализовывал ваши слушатели, хотя это нарушает принцип единой ответственности и делает ваш код более сложным для поддержки и расширения, и поэтому я настоятельно призываю вас не делать этого.

Так, например, внутренний класс для этого:

import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;

class Foo {

   public Foo() {
       JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A));
   }

   private class ButtonAction extends AbstractAction {
      public ButtonAction(String name, Integer mnemonic) {
         super(name);
         putValue(MNEMONIC_KEY, mnemonic);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         System.out.println("button pressed");
      }
   }

}

Второй вариант (анонимный класс), безусловно, лучше, другой вариант будет иметь вложенный класс в Foo,

Я бы не стал использовать первый вариант по двум причинам:

  • Пользователи Foo не должен знать, что он реализует ActionListener,
  • Вы не можете реализовать двух разных слушателей в одном классе.

Это зависит. Если вы хотите повторно использовать ActionListener по нескольким компонентам, первый вариант лучше. Если ActionListener только когда-либо будет связан с одной кнопкой, второй вариант в порядке.

Обычно вы создаете отдельный класс (или внутренний класс), если ожидаете некоторый рост в проекте. Там нет необходимости для Foo реализовать ActionListener,

Другие вопросы по тегам