为什么必须用Java创建Action Listener实例?

时间:2015-02-02 15:27:16

标签: java static instance actionlistener

当我创建一个ActionListener时,例如。对于一个按钮,我必须创建一个ActionListener的实例。特别是当我有几个按钮我说

button1.addActionListener(new MyOwnListener());

和代码中的其他地方我只是创建另一个实例

button2.addActionListener(new MyOwnListener());

因为我懒得两次使用同一个实例。

然而,当您创建这么多无用的实例时,这不是浪费空间。为什么监听器不能是静态的?

MyOwnListener.actionPerformed(event);

而不是

yetAnotherInstance.actionPerformed(event);

我无法想象这是不可行的。您不需要区分同一个类的监听器,只需创建实例,因为必须这样做。

我希望你得到我想说的话,即使我的英语不好。

2 个答案:

答案 0 :(得分:0)

  1. 如果您创建静态侦听器方法,如何在事件发生时告诉您的按钮调用该方法?没有像函数指针那样可以传递给按钮的addActionListener(...)方法。 (从java 8开始,有这样的事情,但这是另一个故事)。

  2. 在大多数情况下,不同的按钮具有不同的含义,并且应该执行不同的代码。

  3. 将所有代码放在静态方法中与面向对象编程无关。这不一定是坏事,但证明你做错了......

  4. 如果您害怕拥有相同侦听器的太多实例,请分享它们!懒惰不是编程错误的借口。 (但如果您共享实例,请确保他们不会保留您不想分享的任何状态信息!)

  5. 从Java 8开始,您可以这样做:

    button1.addListener(MyOwnListener ::的actionPerformed); button2.addListener(MyOwnListener ::的actionPerformed);

  6. 快乐?

答案 1 :(得分:0)

您可以使用单个实例!它只是一团糟,因为它是一个单片事件处理程序。

示例:

MyOwnListener myOwnListener = new MyOwnListener();
button1.addActionListener(myOwnListener);
button2.addActionListener(myOwnListener);

在哪种情况下

public class MyOwnListener implements ActionListener {
     @Override
     public void actionPerformed(ActionEvent e) {
         if(e.getSource() == button1) {
             executeCodeForButton1();
         } else if(e.getSource() == button2) {
             executeCodeForButton2();
         }
     }
}

多个按钮变得有点混乱,并且难以重构。

编辑:一个实例和全局对象,单例模式

public class YourFrame extends JFrame {

    JButton button1;
    JButton button2;

    public YourFrame() {
        ...
        button1 = new JButton("Hello");
        button2 = new JButton("World");
        button1.addActionListener(YourOwnListener.INSTANCE);
        button2.addActionListener(YourOwnListener.INSTANCE);
    }

    public static enum YourOwnListener implements ActionListener {
        INSTANCE;

        private YourOwnListener() {}

        public void actionPerformed(ActionEvent e) {
            if(e.getSource() == button1) {
                executeMethodForButton1();
            } else if(e.getSource() == button2) {
                executeMethodForButton2();
            }
        }
    }
}

但这也是使用一个实例。这是因为他们正在实施Observer模式。侦听器实现表示执行操作时运行的函数,这类似于Javascript中的函数或C / C ++中的函数指针。