哪种实现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 的地方使用。
它提供了其他功能,例如:
- 同一个动作可以被多个组件使用,例如 JButton、JMenuItem
- 您可以禁用该操作,这将禁用使用该操作的所有组件
- 它允许为您的组件分配助记符和加速器
有关此概念的详细信息和示例,请参阅有关如何使用操作的 Swing 教程。
如您所见,对于单ActionListener
方法,每个if
测试还有三个分支,按下了哪个按钮。还没有做任何事情,所以没有真正的动作,只是测试按下了哪个按钮。
-
现在,如果您想实现高质量的工作,可以使用诸如
branch coverage
.首先,如果你选择单一ActionListener
方法,你的每个if
都会创建两个分支。因此,您必须提出 6 个测试来测试您的ActionListener
的基本思想是否正常工作,以便找出按下了哪个按钮以及是否使用了正确的部件。这是一些开销工作。 -
其次,是单一责任范式(SRP)。它指出每个类应该只负责一项任务。现在,这
ActionListener
正在处理三件事。 -
第三,单个
ActionListener
的重复使用非常有限,并且高度依赖于按钮。 -
第四,我也称这种单
ActionListener
方法为Manual written Object Orientation
,因为如果没有面向对象并且您必须切换或if/else来调用不同的方法,例如exampleButton1Pressed()
,exampleButton2Pressed()
等,这将是一种方法。但是,这可以通过三个专用ActionListener
来实现。
所以去专门的ActionListener
。