Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么必须在Java中创建ActionListeners实例?_Java_Static_Instance_Actionlistener - Fatal编程技术网

为什么必须在Java中创建ActionListeners实例?

为什么必须在Java中创建ActionListeners实例?,java,static,instance,actionlistener,Java,Static,Instance,Actionlistener,当我创建ActionListener时,例如,对于按钮,我必须创建ActionListener的实例。特别是当我有几个按钮时,我会说 button1.addActionListener(new MyOwnListener()); 在代码的其他地方,我只是创建了另一个实例 button2.addActionListener(new MyOwnListener()); 因为我太懒了,不能两次使用同一个实例 然而,当您创建这么多无用的实例时,这不是在浪费空间吗。为什么侦听器不能是静态的 MyOwn

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

button1.addActionListener(new MyOwnListener());
在代码的其他地方,我只是创建了另一个实例

button2.addActionListener(new MyOwnListener());

因为我太懒了,不能两次使用同一个实例

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

MyOwnListener.actionPerformed(event);
而不是

yetAnotherInstance.actionPerformed(event);
我无法想象在什么情况下这样做行不通。您不需要区分同一类的侦听器,只需创建实例,因为必须这样做

我希望你明白我想说的话,即使我的英语不好

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

  • 在大多数情况下,不同的按钮有不同的含义,无论如何都应该执行不同的代码

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

  • 如果您担心同一个侦听器的实例太多,请共享它们!懒散不是糟糕编程的借口。(但如果您共享实例,请确保它们不包含任何您不想共享的状态信息!)

  • 自Java 8以来,您可以执行以下操作:

    按钮1.addListener(MyowListener::actionPerformed); 按钮2.addListener(MyowListener::actionPerformed)


  • 高兴吗?

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

    示例:

    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++中的函数指针。

    因为
    static
    属于类而不是实例,您将如何将其应用于特定对象?您将如何告诉
    按钮调用该对象?当然,我指的是方法。抱歉,我不知道如何以一种好的方式解释:/“因为我太懒了,无法使用同一个实例两次。”我不明白这意味着什么。但无论如何,您都要创建一个实例。我认为如果不创建一个实例,就无法做到这一点。然而,我的问题是,为什么没有办法。即使是静态对象也有一个实例,例如enums。1我知道这是不可能的(直到Java 8^^),3当然,当你编写静态程序时,如果它应该是面向对象的,那么这是糟糕的代码。然而,我认为反过来做也不好。您不会创建数学实例,因为它不是数学所必需的。我认为对ActionListeners来说应该是一样的。5.我很高兴。这就是我要找的。快乐=>好!;)我只是想指出,现在的方式是更好的。自从Java8以来,您仍然可以选择。请注意,您不能再删除Java-8-static-method侦听器,因为这两个方法引用彼此不相等。