使用接口侦听器的优点和缺点

时间:2010-09-10 14:30:40

标签: java events

对于实现接口侦听器的以下每种方法,哪些是优缺点:

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) {
            // ...
        }
    });
}

4 个答案:

答案 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