java动作监听器:实现vs匿名类

时间:2014-02-07 15:30:12

标签: java event-handling actionlistener anonymous-class implements

我正在尝试自学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
    }
...
}

3 个答案:

答案 0 :(得分:3)

只有当您的类确实是ActionListener(is-a relationship)并且将在其他地方用作ActionListener时,它才应该实现ActionListener。

如果它仅在内部用作ActionListener,则实现ActionListener将将实现细节泄露给类的API 。在这种情况下使用组合(有关系)。

对于其他接口和超类也是如此。

答案 1 :(得分:1)

这真的归结为一种风格的东西。两者在代码中的执行方式完全相同。

单独的类倾向于使实际方法中的代码更简单,而匿名内部类在方法中带来侦听器实现的代码,这可以使它更清楚它正在做什么。

还有一种情况是匿名内部类可以在创建它们的方法中访问最终变量。您不能使用预先编写的类(尽管可以将变量传递给控制器​​)​​。

单独的代码是可重复使用的 - 所以如果你在多个地方拥有相同的监听器,那么它就是明显的赢家。

答案 2 :(得分:0)

如果您使用匿名类,则代码会变得更易读,但您可能无法重新使用它。

所以,我只会使用一个匿名类,如果它很短,我绝对相信我不会再在任何地方使用它。