Подтвердить что ты не робот

В чем разница между слушателями и адаптерами?

Я пытаюсь различать слушатели и адаптеры.

Они почти одинаковы, но в слушателях вы должны реализовать все методы в интерфейсе, но с адаптерами у вас есть возможность реализовать только те методы, которые вам нужны, чтобы код был очистителем и его легче читать?

Мне также сказали, что адаптеры позволяют создавать экземпляры только с одной реализацией, и вы не можете создавать экземпляры слушателей, я не совсем понимаю это.

Может кто-нибудь объяснить, какой из них лучше использовать, и что вы можете сделать с одним, но не можете с другим?

4b9b3361

Ответ 1

WindowListener interface, который заставляет вас 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) {

    }

}

WindowAdapter

При использовании адаптера код чище:

// 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 существует как удобство для создания объектов-слушателей.

EDIT:

Так как WindowListener - interface, вы можете реализовать его в своем подклассе JFrame.

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

В любом случае вы создаете WindowListener или WindowAdapter — вы создаете анонимные классы, которые реализуют WindowListener/extend WindowAdapter. Но когда вы реализуете интерфейс напрямую, вы вынуждены внедрять все методы, но когда вы расширяете класс адаптера, вы можете только переопределить то, что вам нужно. Этот класс уже имеет именно эти пустые реализации, которые вы должны были записать в случае Listener.

Ответ 3

Существует несколько классов адаптера, таких как MouseAdapter, KeyAdapter, WindowAdapter, которые можно расширить, тем самым избегая писать методы, которые вам не нужны.

Вещь с интерфейсами заключается в том, что вам нужно выписать все методы, которые вам не нужны. Класс Adapter также может быть Sub Classed как способ переопределить требуемый метод.

http://www.cafeaulait.org/course/week7/19.html

Ответ 4

Слушатели используются, когда вы планируете использовать большинство методов интерфейса. Когда вам нужно использовать только некоторые из методов, лучше всего использовать адаптер b/c, вам не придется переопределять оставшиеся методы.

Ответ 5

Существует еще один аспект, который не рассматривается в других ответах: эволюция API. Предоставление классов адаптеров (a.k.a пустые или стандартные реализации интерфейсов) делает введение новых методов в интерфейсах менее болезненным. Если API предоставляет только интерфейсы, то клиенты вынуждены внедрять их, и если к интерфейсам добавляется новый метод, все классы реализации будут разбиты. Однако, если предусмотрены реализации по умолчанию, тогда у клиентов есть возможность расширить те, которые, кроме удобного, помогают им обновлять до новой версии API. С методы по умолчанию реализации по умолчанию/пустое Java 8 стали менее важными, но они могут быть полезны в более старых версиях.