您的类应该实现 ActionListener 还是使用匿名 ActionListener 类的对象

2022-09-02 23:34:49

实现接口的最佳方式是什么?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) {

            }
        });
    }
}

答案 1

有些人(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");
      }
   }

}

答案 2

第二个选项(匿名类)当然更好,另一个选项是在 .Foo

我不会选择第一个选项,原因有两个:

  • 的用户不应该知道它实现了 .FooActionListener
  • 不能在同一类中实现两个不同的侦听器。

推荐