我正在尝试自学Java并且有一个我到目前为止无法回答的问题。在我的一些在线阅读中,我发现了两种使用动作监听器的方法,它们似乎做同样的事情。但我想弄清楚一个人的优势/劣势是什么。
使用这样的匿名类是否更好:
public MyClass() {
...
myButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//doSomething
}
});
...
}
或者最好在课程开头实施,如下所示:
public MyClass() implements ActionListener {
...
myButton.addActionListener(this);
public void actionPerformed(ActionEvent e) {
//doSomething
}
...
}
答案 0 :(得分:3)
只有当您的类确实是ActionListener(is-a relationship)并且将在其他地方用作ActionListener时,它才应该实现ActionListener。
如果它仅在内部用作ActionListener,则实现ActionListener将将实现细节泄露给类的API 。在这种情况下使用组合(有关系)。
对于其他接口和超类也是如此。
答案 1 :(得分:1)
这真的归结为一种风格的东西。两者在代码中的执行方式完全相同。
单独的类倾向于使实际方法中的代码更简单,而匿名内部类在方法中带来侦听器实现的代码,这可以使它更清楚它正在做什么。
还有一种情况是匿名内部类可以在创建它们的方法中访问最终变量。您不能使用预先编写的类(尽管可以将变量传递给控制器)。
单独的代码是可重复使用的 - 所以如果你在多个地方拥有相同的监听器,那么它就是明显的赢家。
答案 2 :(得分:0)
如果您使用匿名类,则代码会变得更易读,但您可能无法重新使用它。
所以,我只会使用一个匿名类,如果它很短,我绝对相信我不会再在任何地方使用它。