一尘不染

侦听器和适配器之间有什么区别?

java

我试图区分侦听器和适配器。

它们是否几乎相同,但是在侦听器中,您必须实现接口中的所有方法,但是对于适配器,您可以选择仅实现所需的方法,从而使代码更简洁,更易于阅读?

我还被告知适配器只能通过一种实现实现实例化,而您不能实例化侦听器,我对此并不完全了解。

有人可以解释使用哪一种更好,而另一种却不能用吗?


阅读 278

收藏
2020-12-03

共1个答案

一尘不染

WindowListenerinterface强制您使用override所有方法的方法,而WindowAdapter是实施方法的,WindowListener您只需要override处理您要处理的方法即可。

WindowListener是接口,意味着你不能实例化的WindowListener,同时WindowAdapter是具体的类,您可以使用new操作符来实例化。

使用时WindowAdapter,代码仅在您的类仅覆盖所需的方法的地方更干净。例如:

WindowListener

public class CloseListener implements WindowListener {
    // im not interest  on this event, but still need to override it
    @Override
    public void windowOpened(WindowEvent e) {

    }
    // im not interest  on this event, but still need to override it    
    @Override
    public void windowClosing(WindowEvent e) {

    }

    @Override
    public void windowClosed(WindowEvent e) {
        System.exit(0);

    }
    // im not interest  on this event, but still need to override it    
    @Override
    public void windowIconified(WindowEvent e) {

    }
    // im not interest  on this event, but still need to override it
    @Override
    public void windowDeiconified(WindowEvent e) {

    }

}

窗口适配器

使用适配器时,代码更干净:

// at JFrame class
addWindowListener(new CloseListener());

// reusable Close Listener
public class CloseListener extends WindowAdapter {
    @Override
    public void windowClosed(WindowEvent e) {
        System.exit(0);
    }
}

要么

addWindowListener(new WindowAdapter() {
    @Override
    public void windowClosed(WindowEvent e) {
         System.exit(0);
     }
});

所以我建议使用WindowAdapter,但不必 遵循
。但是,两个API几乎相同,只是为了WindowAdapter方便创建侦听器对象而存在。

编辑:

由于WindowListenerinterface,因此您可以在JFrame子类中实现它。

public class MainWindow extends JFrame implements WindowListener {
    // this is ok
}
public class MainWindow extends JFrame, WindowAdapter {
    // this is not allow
}

但是你不能用WindowAdapter

2020-12-03