哪种方式是正确的?多个ActionListeners与一个ActionListener

问题描述 投票:0回答:2

实现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 ..?

java swing actionlistener
2个回答
3
投票

我更喜欢使用单独的Action作为按钮的监听器。 Action是一个稍高级的侦听器,可以在任何可以使用ActionListener的地方使用。

它提供了额外的功能,例如:

  1. 多个组件可以使用相同的Action,例如JButton,JMenuItem
  2. 您可以禁用Action,这将禁用使用Action的所有组件
  3. 它允许为您的组件分配助记符和加速器

有关此概念的更多信息和示例,请参阅How to Use Actions上的Swing教程。


0
投票

你可以发现,对于单个ActionListener方法,每个单独的if测试有三个分支,按下按钮。什么也没做,所以没有真正的动作,只是测试按下了哪个按钮。

  • 现在,如果你想要实现高质量的工作,有像branch coverage这样的指标。首先,如果你选择单一的ActionListener方法,你的每个if都会创建两个分支。所以你必须提出6个测试来测试你的ActionListener的基本想法是否正常工作,以便找出按下了哪个按钮以及使用了正确的部分。这是一些开销的努力。
  • 其次,有单一责任范式(SRP)。它规定每个班级应该只负责一项任务。现在,这个单一的ActionListener正在处理三件事。
  • 第三,单个ActionListener的重复使用非常有限,并且高度依赖于按钮。
  • 第四,我也称这种单一的ActionListener方法Manual written Object Orientation,因为这将是一种方法,如果没有面向对象,你必须切换或if / else调用不同的方法,如exampleButton1Pressed()exampleButton2Pressed()等。但是,这可以通过三个专用的ActionListeners实现。

所以去专注的ActionListeners。

© www.soinside.com 2019 - 2024. All rights reserved.