Плюсы и минусы использования интерфейса слушателей - PullRequest
0 голосов
/ 10 сентября 2010

Для каждой из следующих методологий реализации интерфейса прослушивателей, плюсы и минусы:

1) в основной класс как:

class MyClass implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        // ...
    }

    component.addActionListener(this);
}

2)внутренний класс как

class MyClass {
    private class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // ...
        }
    }

    MyActionListener mal = new MyActionListener();
    component.addActionListener(mal);
}

3) как анонимный внутренний класс как

class MyClass {
    component.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // ...
        }
    });
}

Ответы [ 4 ]

1 голос
/ 10 сентября 2010

Реализация интерфейсов обратного вызова для существующих классов - чистое зло.Очевидно.Просто не делай этого.Всегда.

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

Анонимные внутренние классы относительно лаконично.Они устраняют необходимость добавлять поля и конструкторы для копирования полей.Искушение, которое испытывают некоторые люди, чтобы сделать поля локальных переменных в «главном» классе, исчезает.Вы можете просто сделать локальные переменные из включающего метода final.«Повторное использование» может быть достигнуто с помощью стандартного программирования, не прибегая к введению более именованных классов.

0 голосов
/ 10 сентября 2010

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

Кроме того, # 2 позволяет вашему внутреннему классу иметь конструктор с аргументами и включать поля, если они еще не были доступны из содержащей верхвысший класс.

0 голосов
/ 10 сентября 2010

Если у вашего основного класса нет причин выставлять ActionListener функциональность вне самого себя, тогда это деталь реализации, и вы не хотите идти с # 1.# 1 блокирует вас для предоставления этого интерфейса.

Вы увидите много # 3, но я никогда не был фанатом.Если вы сделаете это, вы не сможете повторно использовать эту реализацию ActionListener где-либо еще.

По этой причине я бы выбрал либо # 2, либо тот, который вы не упомянули, - созданиекласс уровня пакета, который выполняет реализацию (что позволяет использовать его в другом месте).

0 голосов
/ 10 сентября 2010

Анонимный внутренний класс (3) может использоваться только для одного компонента, и я обычно использую его для делегирования защищенному методу во внешнем классе без параметра Event.позволяет повторно использовать экземпляр Listener для нескольких компонентов, но затем необходимо определить через объект Event исходный компонент.

Так что выбор между (1) / (2) или (3) зависит от задачи.

Greetz, GHad

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...