创建实现ActionListener的嵌套类是否有任何好处或缺点:
public class Foo{
Foo(){
something.addActionListener(new ButtonListener());
}
//...
private class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
与在主类本身中实现ActionListener相比:
public class Foo implements ActionListener{
Foo(){
something.addActionListener(this);
}
//...
public void actionPerformed(ActionEvent e){
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我经常看到这两个例子,只是想知道是否有"最佳实践".
当尝试采用使用匿名或嵌套类实现侦听器的风格以隐藏除侦听之外的其他用途的通知方法时(即,我不希望任何人能够调用 actionPerformed)。例如来自java 动作监听器:实现 vs 匿名类:
public MyClass() {
myButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//doSomething
}
});
}
Run Code Online (Sandbox Code Playgroud)
问题是是否有一种优雅的方式使用这个习语再次删除监听器?我发现 的实例化ActionListener不会每次都产生相同的对象,因此Collection.remove()不会删除最初添加的对象。
为了被认为是平等的,听众应该有相同的外部 this。要实现 equals,我需要为另一个对象获取外部 this。所以它会是这样的(我觉得有点笨拙):
interface MyListener {
Object getOuter();
}
abstract class MyActionListener extends ActionListener
implement MyListener {
}
public MyClass() {
myButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// doSomething on MyClass.this
}
public Object getOuter() {
return MyClass.this;
}
public boolean equals(Object other)
{
if( other instanceof MyListener )
{ …Run Code Online (Sandbox Code Playgroud)