为什么必须在Java中创建ActionListeners实例?
当我创建ActionListener时,例如,对于按钮,我必须创建ActionListener的实例。特别是当我有几个按钮时,我会说为什么必须在Java中创建ActionListeners实例?,java,static,instance,actionlistener,Java,Static,Instance,Actionlistener,当我创建ActionListener时,例如,对于按钮,我必须创建ActionListener的实例。特别是当我有几个按钮时,我会说 button1.addActionListener(new MyOwnListener()); 在代码的其他地方,我只是创建了另一个实例 button2.addActionListener(new MyOwnListener()); 因为我太懒了,不能两次使用同一个实例 然而,当您创建这么多无用的实例时,这不是在浪费空间吗。为什么侦听器不能是静态的 MyOwn
button1.addActionListener(new MyOwnListener());
在代码的其他地方,我只是创建了另一个实例
button2.addActionListener(new MyOwnListener());
因为我太懒了,不能两次使用同一个实例 然而,当您创建这么多无用的实例时,这不是在浪费空间吗。为什么侦听器不能是静态的
MyOwnListener.actionPerformed(event);
而不是
yetAnotherInstance.actionPerformed(event);
我无法想象在什么情况下这样做行不通。您不需要区分同一类的侦听器,只需创建实例,因为必须这样做
我希望你明白我想说的话,即使我的英语不好
addActionListener(…)
方法。
(从Java8开始,就有这样一个东西,但那是另一个故事)高兴吗?您可以使用单个实例!它只是一团乱,因为它是一个单一的事件处理程序 示例:
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侦听器,因为这两个方法引用彼此不相等。