哪种方式是正确的?多个操作侦听器与一个操作侦听器



哪种实现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
}
}
}

与向每个 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..?

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

它提供了其他功能,例如:

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

有关此概念的详细信息和示例,请参阅有关如何使用操作的 Swing 教程。

如您所见,对于单ActionListener方法,每个if测试还有三个分支,按下了哪个按钮。还没有做任何事情,所以没有真正的动作,只是测试按下了哪个按钮。

  • 现在,如果您想实现高质量的工作,可以使用诸如branch coverage.首先,如果你选择单一ActionListener方法,你的每个if都会创建两个分支。因此,您必须提出 6 个测试来测试您的ActionListener的基本思想是否正常工作,以便找出按下了哪个按钮以及是否使用了正确的部件。这是一些开销工作。

  • 其次,是单一责任范式(SRP)。它指出每个类应该只负责一项任务。现在,这ActionListener正在处理三件事。

  • 第三,单个ActionListener的重复使用非常有限,并且高度依赖于按钮。

  • 第四,我也称这种单ActionListener方法为Manual written Object Orientation,因为如果没有面向对象并且您必须切换或if/else来调用不同的方法,例如exampleButton1Pressed()exampleButton2Pressed()等,这将是一种方法。但是,这可以通过三个专用ActionListener来实现。

所以去专门的ActionListener

最新更新