прослушиватель действий 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 5

3 ответа:

На самом деле все сводится к стилю. Оба будут работать в коде совершенно одинаково.

Отдельный класс будет стремиться упростить код внутри вашего фактического метода, в то время как анонимный внутренний класс приносит код для реализации слушателя в методе, который может сделать его более ясным, что он делает.

Существует также случай, когда анонимные внутренние классы могут получить доступ к конечным переменным в методе, который их создает. Вы не можете сделать это с заранее написанным классом (хотя вы можете передать переменные в контроллер).

Отдельный код можно использовать повторно - так что если у вас есть один и тот же слушатель в нескольких местах, то это явный победитель.

Только если ваш класс действительно является ActionListener (is-a relationship) и будет использоваться в качестве ActionListener где-то еще, он должен реализовать ActionListener.

Если он просто используется внутри как ActionListener, реализация ActionListener будет сливать детали реализации в API класса. Используйте композицию в этом случае (имеет-отношение).

Это справедливо и для других интерфейсов и суперклассов.

Если вы используете анонимный класс, код становится более читаемым, но вы не можете повторно использовать его.

Итак, я буду использовать анонимный класс только в том случае, если он короткий, и я абсолютно уверен, что мне не придется использовать его снова где-либо.