При попытке применить стиль реализации прослушивателя с использованием анонимного или вложенного класса, чтобы скрыть методы уведомления для других целей, кроме прослушивания (т.е. я не хочу, чтобы кто-либо мог вызывать actionPerformed). Например, из прослушиватель действий Java: реализует против анонимного класса:
public MyClass() {
myButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//doSomething
}
});
}
Вопрос в том, есть ли элегантный способ снова удалить слушателя, используя эту идиому? Я понял, что создание экземпляра ActionListener
не создает каждый раз одинаковые объекты, поэтому Collection.remove()
не удалит первоначально добавленный объект.
Чтобы считаться равными, слушатели должны иметь одинаковое внешнее это. Чтобы реализовать 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 )
{
return getOuter() == other.getOuter();
}
return super.equals(other);
});
}
}
Или мне придется оставить объект ActionListener в качестве (закрытого) члена внешнего класса?
equals()
в анонимном классе, не так ли? - person Alex Salauyou   schedule 29.04.2015