Какой путь правильный?Несколько ActionListener против одного ActionListener - PullRequest
0 голосов
/ 07 апреля 2019

Какой способ реализации ActionListener является более правильным? Существуют ли существенные различия в производительности?

Реализация ActionListener для класса:

public class MainFrame implements ActionListener {

    JButton exampleButton1 = new JButton();
    JButton exampleButton2 = new JButton();
    JButton exampleButton3 = new JButton();

    public MainFrame(){
        exampleButton1.addActionListener(this);
        exampleButton2.addActionListener(this);
        exampleButton3.addActionListener(this);
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();

        if(src.equals(exampleButton1)){
            //Do something
        }else if(src.equals(exampleButton2)){
            //Do something
        }else if(src.equals(exampleButton3)){
            //Do something
        }
    }
}

По сравнению с добавлением ActionListeners к каждому JButton:

public class MainFrame {

    JButton exampleButton1 = new JButton();
    JButton exampleButton2 = new JButton();
    JButton exampleButton3 = new JButton();

    public MainFrame(){
        exampleButton1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Do something
            }
        });

        exampleButton2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Do something
            }
        });

        exampleButton3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //Do something
            }
        });
    }
}

Или, может быть, даже используя Lambdas ..?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2019

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

Предоставляет дополнительную функциональность, такую ​​как:

  1. Одно и то же действие может использоваться несколькими компонентами, такими как JButton, JMenuItem
  2. Вы можете отключить действие, которое отключит все компоненты, которые используют действие
  3. Позволяет назначать мнемонику и ускорители для ваших компонентов

См. Учебник Swing по Как использовать действия для получения дополнительной информации и примеров по этой концепции.

0 голосов
/ 09 апреля 2019

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

  • Теперь, если вы хотите добиться высокого качества работы, есть такие метрики, как branch coverage. Во-первых, если вы идете по единственному ActionListener -приближению, каждый из ваших if создает две ветви. Таким образом, вам нужно придумать 6 тестов, чтобы просто проверить, правильно ли работает базовая идея вашего ActionListener, чтобы выяснить, какая кнопка была нажата и правильная, если деталь использовалась. Это накладные расходы.

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

  • В-третьих, повторное использование одного ActionListener очень ограничено и сильно зависит от кнопок.

  • В-четвертых, я также называю этот тип одиночного ActionListener -приступа Manual written Object Orientation, потому что это был бы подход, если бы не было объектной ориентации, и вам нужно переключаться или если / иначе для вызова различных методов, как exampleButton1Pressed(), exampleButton2Pressed() и т. д. Но этого можно достичь с помощью трех выделенных ActionListener с.

Итак, перейдите к выделенным ActionListener с.

...