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

Использование анонимных классов


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

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


/** Demonstrates the use of a local inner class. */
public void myFunc() {
class LocalInnerClass {
// Class declaration
}
LocalInnerClass lic = new LocalInnerClass();
}

Когда внутренний класс определяется внутри выражения анонимно (без имени), он называется анонимным внутренний классом. Анонимный внутренний класс по настоящему удобен, если вам просто необходимо иметь один или два метода содержащие пару строчек кода. Внутренние классы обычно используются для простой обработки событий. Следующий кусочек кода демонстрирует это:

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

/** Displays a confirmation dialog. */
class ConfirmDlg extends Dialog {

/** ID for the OK button. */
public final static int ID_OK = 1;
/** ID for the Cancel button. */
public final static int ID_CANCEL = 2;
/** The font of the dialog box text. */
public final static Font TEXT_FONT = new Font("Arial", Font.BOLD, 12);
/** The background color of the dialog box. */
public final static Color BGCOLOR = Color.lightGray;
/** The return status/value of the dialog box. */
private int status;

/** Initializes the dialog box with the specified message. */
public ConfirmDlg(Frame parent, String msg) {

// Initialize super
super(parent, "Confirm");

// Make it modal
setModal(true);

// Create message box components
Label lbl = new Label(msg, Label.CENTER);
lbl.setFont(TEXT_FONT);
Button okButn = new Button("OK");
Button cancelButn = new Button("Cancel");

// Panel to hold the buttons
Panel butnPanel = new Panel(new FlowLayout());
butnPanel.add(okButn);
butnPanel.add(cancelButn);

// Set background
setBackground(BGCOLOR);

// Add components
setLayout(new BorderLayout());
add(lbl, BorderLayout.CENTER);
add(butnPanel, BorderLayout.SOUTH);

// Add listeners
// The listeners here are instances of anonymous classes
okButn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
status = ID_OK;
destroy();
}
});
cancelButn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ae) {
status = ID_CANCEL;
destroy();
}
});
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
status = ID_CANCEL;
destroy();
}
});

}

/** Displays the dialog box. */
public int display() {
// Pack and show the dialog box
pack();
setVisible(true);
return status;
}

/** Destroys the dialog box. */
protected void destroy() {
setVisible(false);
dispose();
}

}

/** Demonstrates the use of anonymous inner class. */
public class AnonymousClassDemo extends Frame {

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

/** Initializes the demo. */
public AnonymousClassDemo() {
super("Anonymous 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) {
AnonymousClassDemo acd = new AnonymousClassDemo();
}

/** 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) {
// Confirm exit
// Note the way the instance of the outer class is referred
// (using "AnonymousClassDemo.this")
ConfirmDlg confirmDlg = new ConfirmDlg(AnonymousClassDemo.this,
"Exit demo? (y/N)");
if (confirmDlg.display() == ConfirmDlg.ID_OK) {
dispose();
System.exit(0);
}
}
}

}
Этот пример делает несколько интересных вещей. Во-первых метод main() инициализирует экземпляр AnonymousClassDemo. Конструктор AnonymousClassDemo инициализирует фрейм приложения и добавляет метку сообщения. Далее он добавляет слушателя окна и только затем отображает фрейм. Слушатель окна создает экраны подтверждения при попытке пользователя покинуть приложение. Панель диалога требует для своей работы родительский фрейм. Для этого мы используем AnonymousClassDemo.this. В основном внутренний класс может ссылаться на экземпляр внешнего класса используя OuterClassName.this.

Класс диалога подтверждения - ConfirmDlg, один из тех, которые нас сейчас интересуют. Он использует 3 анонимных класса являющимися обработчиками событий.

1. для кнопки "OK"
2. для кнопки "cancel"
3. для закрытия диалогового окна

Эти обработчики событий содержат очень простую логику для обновления и возврата значения в текстовое окно. Возвращаемое значение используется для метода windowClosing() , где и определяется, должна ли быть продолжена процедура выхода.

Как вы можете видеть, анонимный класс определен на месте, т.е. прямо там, где используется его экземпляр. Интересной особенностью анонимного класса является то, что он не имеет конструктора. Это очевидно, ведь этот класс не имеет имени. Да, он имеет несомненно, статический инициализатор. Если же вы хотите выполнить конструктор суперкласса, который имеет несколько аргументов, то передайте эти аргументы в выражение new как показано ниже:

// The MyAdapterClass has a constructor that takes one String argument
...
String name = "Name";
MyAdapterClass my = new MyAdapterClass(name) {
// The overriden method
void overridenMethod() {
// ...
}
}
...
Анонимные классы хороши для написания одного или двух методов, содержащий может быть всего лишь по паре строк кода. Возможно, в будущем вы захотите получить именованные классы. Так что анонимные классы идеально подходят в тех случаях, когда вам необходим простой внутренний класс и когда создание именованного класса понизит чистоту кода.
Домен продается

Популярное

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

Карта сайта: 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

Друзья сайта



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

Eric S. Raymond:

"Обучение программированию не может научить быть экспертом, также как и изучение кистей и красок не может превратить кого-либо в художника."

Опрос

Как Вам новый дизайн сайта?

Отлично
Неплохо
Нормальный
Ужасно