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

2022-09-02 00:59:03

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

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

我还被告知,适配器仅使用一个实现即可实现实例化,并且您无法实例化侦听器,我不完全理解这一点。

有人可以解释一下哪一个更好用,以及你可以用一个做但你不能用另一个做的事情吗?


答案 1

WindowListener是强制您使用所有方法的,而WindowAdapter是实现的,您只需要处理您感兴趣的方法。interfaceoverrideWindowListeneroverride

WindowListener是接口,这意味着你不能实例化 ,而它是具体的类,你可以使用运算符来实例化。WindowListenerWindowAdapternew

使用 时,代码会更干净,其中类仅重写所需的方法。例如:WindowAdapter

窗口过滤器

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);
     }
});

所以我建议使用,但不是必须遵循。但是,其中两个 API 大致相同,只是为了方便创建侦听器对象而存在。WindowAdapterWindowAdapter

编辑:

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

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

但是你不能用.WindowAdapter


答案 2

你可以用任何一个做任何事情,但是如果你从接口开始,你的代码将有很多样板。我相信当你尝试它时,你已经注意到了这一点。关于实例化等的陈述是一种非常复杂的说法,并且有很多术语的混淆。你可以写

c.addWindowListener(new WindowListener() {
  @Override public void windowActivated(WindowEvent arg0) { }
  @Override public void windowClosed(WindowEvent arg0) { System.exit(0); }
  @Override public void windowClosing(WindowEvent arg0) { }
  @Override public void windowDeactivated(WindowEvent arg0) { }
  @Override public void windowDeiconified(WindowEvent arg0) { }
  @Override public void windowIconified(WindowEvent arg0) { }
  @Override public void windowOpened(WindowEvent arg0) { }
});

或者你可以写

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

在这两种情况下,您都没有实例化任何一个,或者 - 您正在创建实现 /extend 的匿名类。但是当你直接实现接口时,你被迫实现所有的方法,当你扩展适配器类时,你只能重写你需要的东西。该类已经具有您必须在案例中编写的这些空实现。WindowListenerWindowAdapterWindowListenerWindowAdapterListener


推荐