4

当我输入以下代码时:

JButton aButton = new JButton("Button");
aButtin.addActionListener(this);

我的 IDE (NetBeans) 将此突出显示为泄漏此声明。尽管使用这样的语句似乎从来没有任何负面影响,但我读过的一些文档表明,更合适的方法是将动作侦听器添加为实现 ActionListener 的内部类的新实例。NetBeans 和这些文档知道我不知道什么?泄露此声明的真正含义是什么?以这种方式使用它是否有我不知道的负面影响?

4

3 回答 3

4

有三种方式

  • aButton.addActionListener(this);在类声明包含implements ActionListener并且也有的public void actionPerformed(ActionEvent ae) {情况下

伪代码

public class ButtonDemo implements ActionListener{

    aButton.addActionListener(this);    

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if (source == aButton) {

        } 
    }
}
  • aButton.addActionListener(new ButtonPress());在 ActionLIsener 被声明为单独的类的情况下

伪代码

public class ButtonDemo {    
     aButton.addActionListener(new ButtonPress());
}

public class ButtonPress implements ActionListener {

    @Override
    public void actionPerformed(ActionEvent e) {

    }
}
  • 更简单,清晰且没有副作用(有两种方法)是创建内部匿名侦听器

伪代码

    aButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {

        }
    });
于 2013-08-07T20:26:25.387 回答
2

如果您使用this,那么为了this处理来自多个来源的 ActionEvent,您需要添加逻辑来检查操作的来源或命令字符串。这是完全合理的。

如果您使用其他类,那么您可以使用在其他地方实现的 ActionListener,或者重用为特定通用目的而设计的 ActionListener,或者定义例如匿名内部类 inline,这在您的情况下可能很方便。这也是完全合理的。

不要用“优点”或“缺点”来思考——这是一个常见的错误(做 xyz 是“坏”吗?xyz 是“好做法”吗?)。您使用对您的情况最有意义的任何东西,并提供最清晰、最可维护、功能正常的代码。有常识,熟悉你正在使用的语言和可用的选项,做出理智的判断。语言是一种表达想法的方式,说清楚(类型)。

于 2013-08-07T20:21:08.177 回答
1

我想使用内部类实现的一个缺点是侦听器不能被其他按钮重用,以防它们应该具有相同的侦听器。像这样的东西:

你可以为不同的按钮使用相同的 OnClickListener 吗?

于 2013-08-07T20:19:31.640 回答