对于实现接口侦听器的以下每种方法,哪些是优缺点:
1)进入主类:
class MyClass implements ActionListener {
public void actionPerformed(ActionEvent e) {
// ...
}
component.addActionListener(this);
}
2)作为内部类
class MyClass {
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
// ...
}
}
MyActionListener mal = new MyActionListener();
component.addActionListener(mal);
}
3)作为匿名内部类
class MyClass {
component.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// ...
}
});
}
答案 0 :(得分:1)
实现现有类的回调接口纯粹是邪恶的。明显。只是不要这样做。如初。
非本地内部阶级有点无意义。你可以使用它们继承,它们可以有多个构造函数,它们有一个名称等。如果你有这些要求,那么你真的应该寻找新的外部类。
匿名内部类相对简洁。它们不需要添加字段和构造函数来复制字段。一些人认为在“主”类中创建局部变量字段的诱惑消失了。您可以从封闭方法final
中创建局部变量。 “重用”可以通过沼泽标准编程实现,而不必诉诸于引入更多命名类。
答案 1 :(得分:0)
如果您的主类没有理由在之外公开ActionListener
功能,那么这是一个实现细节,您不希望使用#1。 #1阻止你提供该接口。
你会看到很多#3,但我永远不会成为粉丝。如果您这样做,则无法在其他任何地方重用ActionListener
实现。
出于这个原因,我要么使用#2,要么使用你未提及的那个,这是一个实现实现的包级别类(允许你在其他地方重用它)。
答案 2 :(得分:0)
除了他人提到的界面和重用问题之外,还要考虑可读性。如果actionPerformed()的实现很长,第三个可能会降低可读性。
此外,#2允许您的内部类具有带参数的构造函数,并包含字段,如果那些尚未从包含的顶级类中获得的那些字段。
答案 3 :(得分:-1)
匿名内部类(3)只能用于一个组件,我通常使用它来委托外部类中没有Event参数的受保护方法。
(1)和(2)允许为多个组件重用Listener实例,但是需要通过Event对象找到源组件。
因此,可以在(1)/(2)或(3)之间进行选择。
格尔茨, GHAD