哪种方式实现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
}
}
}
相对于向每个JButton添加ActionListeners:
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。?
答案 0 :(得分:3)
我希望使用单独的Word
作为按钮的侦听器。 Action
是稍微高级一点的侦听器,可以在可以使用ActionListener的任何地方使用。
它提供了其他功能,例如:
有关此概念的更多信息和示例,请参见https://nlp.stanford.edu/nlp/javadoc/javanlp/index.html?edu/stanford/nlp/ling/Word.html上的Swing教程。
答案 1 :(得分:0)
您可以发现,对于单个ActionListener
方法来说,每个单个if
测试都有三个分支,按下了那个按钮。尚未执行任何操作,因此没有实际动作,只是测试按下了哪个按钮。
现在,如果要实现高质量的工作,可以使用branch coverage
之类的指标。首先,如果您采用单一的ActionListener
方法,那么每个if
都会创建两个分支。因此,您必须拿出6个测试来测试ActionListener
的基本概念是否正确运行,以便找出按下了哪个按钮以及是否使用了正确的部件。这是一些开销的工作。
其次,这里有单一责任范式(SRP)。它指出,每个班级仅应负责一项任务。现在,单个ActionListener
正在处理三件事。
第三,单个ActionListener
的重用非常有限,并且在很大程度上取决于按钮。
第四,我也将这种单一的ActionListener
方法称为Manual written Object Orientation
,因为如果没有面向对象的方法,而您必须进行切换,或者如果/否则,这将是一种方法。调用不同的方法,例如exampleButton1Pressed()
,exampleButton2Pressed()
等。但是,这可以通过三个专用的ActionListener
来实现。
因此,请专门使用ActionListener
。