WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Использование внутренних классов и адаптеров

Использование внутренних классов и адаптеров


Дата публикации: 17-03-2013

Во время написания программ на Java, иногда в них требуется использовать некий класс представитель, для определения определенной ответственности. Например, вы можете захотеть иметь класс-представитель для сохранения важных данных, когда пользователь закроет пользовательский интерфейс приложения. Java 1.1 предоставляет для этих целей внутренние классы.

В принципе внутренний класс такой же, как и любой другой класс, но он объявляется внутри другого класса, обычно называемого внешний класс. Внутренний класс похож на любого другого члена внешнего класса. Например, он имеет доступ к частным (private) данным внешнего класса и наоборот. Польза от этого значительна, поскольку вам не нужно прятать ваш класс при раскрытии частных членов класса.

Одним наиболее популярным применением внутренних классов являются обработчики событий. Java 1.1 предоставляет концепцию слушателей событий зарегистрированных как слушателей события. Когда совершается событие, вызывается соответствующий метод объекта-слушателя. Что бы стать слушателем объект имплемецирует подходящий интерфейс слушателя или расширяет желаемый адаптер (про них ниже). Например, для обработки нажатия кнопки обработчик должен имплемецировать интерфейс java.awt.event.ActionListener.

Зачастую вы не хотите имплемецировать все функциональность слушателя полностью. Для примера, вы можете быть заинтересованы в обработке события закрытия вашего приложения, но вам совершенно не нужно знать, когда ваше приложение будет просто свернуто. Для этого были добавлены адаптеры в Java 1.1. Они являются классами AWT которые имплемецируют интерфейсы слушателей и предоставляют тупую имплементацию методов этих интерфейсов. Например, java.awt.event.WindowAdapter имплемицирует интерфейс java.awt.event.WindowListener и предоставляет тупые методы типа windowClosing() и т.д.

И вот здесь кроется ловушка. Если вы хотите использовать адаптер, то вам необходимо расширить (extend) его. Иначе вы должны имплемецировать все несущественные методы интерфейса слушателя. Как разрешить возникшую проблему? Правильно - использовать внутренние классы. Вот как вы можете добиться этого:

1. Создайте внутренний класс который расширяет соответствующий адаптер (adapter)
2. Переопределите желаемые методы в этом внутреннем классе, например, windowClosing()
3. Используйте представление этого внутреннего класса в качестве слушателя событий

Теперь давайте пройдемся по исходном коду:



import java.awt.*;
import java.awt.event.*;

/** Demonstrates the use of an inner class. */
public class InnerClassDemo extends Frame {

/** The demo message. */
public final static String DEMO_MSG =
"Inner class demo. Now, close the application.";

/** Initializes the demo. */
public InnerClassDemo() {
super("Inner Class Demo");
// The demo message
Label lbl = new Label(DEMO_MSG, Label.CENTER);
add(lbl);
// Set the window handler
addWindowListener(new WindowHandler());
// Pack and show
pack();
setVisible(true);
}

/** Main. */
public static void main(String[] args) {
InnerClassDemo icd = new InnerClassDemo();
}

/** Inner class to handle window event(s). */
private class WindowHandler extends WindowAdapter {
/** Handles the event when the window is being closed. */
public void windowClosing(WindowEvent we) {
// Do any exit specific handling here
// and then exit
dispose();
System.exit(0);
}
}

}
В переставленном коде приложения main() создает представление InnerClassDemo. Конструктор этого класса регистрирует представление WindowHandler как слушателя. Внутренний класс WindowHandler расширяет java.awt.event.WindowAdapter. Он переопределяет метод windowClosing(). Этот метод будет вызван когда пользователь закроет приложение. В этой программе закрытие приложения обрабатывается по простому пути. Вы можете захотеть запросить пользователя о подтверждении выхода и сохранении любых модифицированных данных.

Несмотря на то, что внутренние классы наиболее часто используются для обработки событий область их применения этим не ограничивается. Например, java.util.Vector использует внутренний класс для перечисления элементов. А кратко, используйте внутренние классы, когда это имеет смысл использовать один класс внутри другого.

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Март 2017 (1)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    Pixadel:

    "Хорошо, Java, ВОЗМОЖНО, хороший пример того как должен выглядеть язык. Но тогда программы на Java — это хороший пример как НЕЛЬЗЯ писать программы."

    Опрос

    Какой браузер Вы используете?

    Internet Explorer
    Google Chrome
    Mozilla Firefox
    Netscape Navigator
    Maxthon Browser
    Opera
    Mozilla Suite
    SeaMonkey
    K-Meleon
    Safari
    Amaya
    Avant Browser
    SlimBrowser
    Другой...