прослушиватель действий java: реализует vs анонимный класс
Я пытаюсь обучить себя Java и у меня возник вопрос, на который я не смог ответить до сих пор. В некоторых моих чтениях в Интернете я нашел два способа использования слушателя действий, которые, похоже, делают одно и то же. Но я пытаюсь выяснить, в чем преимущество/недостаток одного над другим.
Лучше ли использовать анонимный класс следующим образом:
public MyClass() {
...
myButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//doSomething
}
});
...
}
Или лучше всего реализовать в начале класса так:
public MyClass() implements ActionListener {
...
myButton.addActionListener(this);
public void actionPerformed(ActionEvent e) {
//doSomething
}
...
}
3 ответа:
На самом деле все сводится к стилю. Оба будут работать в коде совершенно одинаково.
Отдельный класс будет стремиться упростить код внутри вашего фактического метода, в то время как анонимный внутренний класс приносит код для реализации слушателя в методе, который может сделать его более ясным, что он делает.
Существует также случай, когда анонимные внутренние классы могут получить доступ к конечным переменным в методе, который их создает. Вы не можете сделать это с заранее написанным классом (хотя вы можете передать переменные в контроллер).
Отдельный код можно использовать повторно - так что если у вас есть один и тот же слушатель в нескольких местах, то это явный победитель.
Только если ваш класс действительно является ActionListener (is-a relationship) и будет использоваться в качестве ActionListener где-то еще, он должен реализовать ActionListener.
Если он просто используется внутри как ActionListener, реализация ActionListener будет сливать детали реализации в API класса. Используйте композицию в этом случае (имеет-отношение).
Это справедливо и для других интерфейсов и суперклассов.