Классы-адаптеры
Чтобы зарегистрировать блок прослушивания, нужно указать его в объявлении класса как наследуемый. В результате этого класс, наследующий данный интерфейс, должен содержать код реализации всех объявленных в интерфейсе методов. Если таких методов много, а нужен только один, то все равно приходится включать код реализации каждого объявленного в интерфейсе метода. Альтернативой такому подходу служит применение классов адаптеров.
Класс-адаптер для интерфейса блока прослушивания содержит "пустую" реализацию всех его методов. Таким образом, при создании класса, как производного от класса-адаптера, в качестве блока прослушивания можно указывать класс-адаптер и включать реализацию только необходимых методов.
На следующей схеме приведен пример обработки события "щелчок мышью" двумя способами: с применением интерфейса блока прослушивания и с применением адаптера блока прослушивания.
public class MyClass implements MouseListener { ... myObject.addMouseListener(this); ... /* Реализация всех методов интерфейса MouseListener */ public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { ...// Код метода } } |
public class MyClass extends MouseAdapter { ... myObject.addMouseListener(this); ... /* Переопределение только одного метода адаптера MouseAdapter */ public void mouseClicked(MouseEvent e) } ...// Код переопределяемого метода } } |
Приведенный выше пример в практическом плане имеет один недостаток. При программировании классы приложений в большинстве случаев создаются как производные от классов Frame, Panel, JFrame, а классы апплетов - от класса Applet или JApplet. Но в языке Java реализовано только простое наследование, позволяющее иметь всего один наследуемый класс.
Поэтому, чтобы применять классы-адаптеры, можно использовать два способа реализации:
- использование внутренних классов: public class MyClass extends Applet { ... // Создание объекта класса адаптера: myObject.addMouseListener(new MyClassAdapter()); ...
class MyClassAdapter extends MouseAdapter {//Объявление // внутреннего класса адаптера public void mouseClicked(MouseEvent e) { ... } // Реализация методов класса адаптера } }
- использование анонимных внутренних классов:
public class MyClass extends Applet { ... // Создание объекта и реализация класса адаптера: myObject.addMouseListener(new MouseAdapter() { // Реализация переопределяемых методов класса адаптера public void mouseClicked(MouseEvent e) { } }); } }
Для того чтобы реализовать применение класса-адаптера с использованием вложенного класса, следует:
- добавить блок прослушивания компонента и указать в качестве параметра код new имя_внутреннего_класса (например, addMouseListener(new MouseAdapter() );
- добавить код с объявлением внутреннего класса, включающий реализацию требуемых методов обработчиков событий (например, class MyClassAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) { ѕ }}.)
Для того чтобы реализовать применение класса адаптера с использованием вложенного анонимного класса-адаптера, следует:
- добавить блок прослушивания компонента и указать в качестве параметра код new имя_класса_адаптера { } (например, addMouseListener(new MyClassAdapter(){ });
- вставить в фигурные скобки после имени класса адаптера код переопределяемых методов (например, { public void mouseClicked(MouseEvent e) { ѕ }}).
Использование анонимных вложенных классов значительно улучшает читаемость кода.