Java 删除匿名侦听器

Java 删除匿名侦听器,java,collections,listener,anonymous,Java,Collections,Listener,Anonymous,当尝试采用使用匿名或嵌套类实现侦听器的方式来隐藏通知方法以用于侦听以外的其他用途时(即,我不希望任何人能够调用actionPerformed)。例如: 问题是,是否有一种优雅的方法可以再次使用此成语删除侦听器?我发现,ActionListener的实例化不会每次生成相同的对象,因此Collection.remove()不会删除最初添加的对象 为了被认为是平等的,监听器应该具有相同的外部属性。为了实现equals,我需要为另一个对象获得这个外部对象。所以它会是这样的(我觉得有点笨拙): 或者我会被

当尝试采用使用匿名或嵌套类实现侦听器的方式来隐藏通知方法以用于侦听以外的其他用途时(即,我不希望任何人能够调用actionPerformed)。例如:

问题是,是否有一种优雅的方法可以再次使用此成语删除侦听器?我发现,
ActionListener
的实例化不会每次生成相同的对象,因此
Collection.remove()
不会删除最初添加的对象

为了被认为是平等的,监听器应该具有相同的外部属性。为了实现equals,我需要为另一个对象获得这个外部对象。所以它会是这样的(我觉得有点笨拙):


或者我会被迫将ActionListener对象保留为外部类的(私有)成员吗?

将匿名侦听器分配给私有局部变量,例如

public MyClass() {
    private Button myButton = new Button();
    private ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //doSomething
        }
    };
    private initialize() {
        myButton.addActionListener(actionListener);
    }
}

稍后,您可以使用私有变量
actionListener
再次删除它。

这就是匿名类的美妙之处——它们是匿名的:-)

不,没有类似优雅的习惯用法可以再次删除侦听器。唯一的方法是遍历
getActionListeners()
并删除所需的。当然,如果只有一个,那么很容易:

myButton.removeActionListener( myButton.getActionListeners()[ 0 ] );

这并不难看。

您可以通过在匿名类中重写
equals()
使这些对象相等,否?为什么不能使用removeActionListener?removeActionListener取决于要删除的对象与提供给removeActionListener的对象相等。我对这个问题进行了编辑,解释了为什么我认为实现equals()会带来一些开销。虽然这不是我想要的答案,但似乎需要将侦听器分配给局部变量。
public MyClass() {
    private Button myButton = new Button();
    private ActionListener actionListener = new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //doSomething
        }
    };
    private initialize() {
        myButton.addActionListener(actionListener);
    }
}
myButton.removeActionListener( myButton.getActionListeners()[ 0 ] );