Зачем кому-то пользоваться inner class
? Та же функциональность может быть достигнута с помощью local class
или subclass
.Как использовать внутренний класс на практике
Пример также будет оценен.
Зачем кому-то пользоваться inner class
? Та же функциональность может быть достигнута с помощью local class
или subclass
.Как использовать внутренний класс на практике
Пример также будет оценен.
Внутренних классов может быть использован во многих функциональных случаях. Они представляют два преимущества:
С учетом этого вы можете понять, что внутренние классы должны использоваться там, где все вместе.
Таким образом, наиболее вероятным случаем является то, что вам не нужен внутренний класс вне внешнего класса. например:
class ScreenCapture {
class CaptureButtonListener implements ClickListener {
public void onClick(ClickEvent click) {
//..capture
pressCount++;
}
}
Button button = new Button("capture");
int pressCount = 0;
void addListeners() {
button.addClickListener(new CaptureButtonListener());
}
}
Как вы можете видеть:
new CaptureButtonListener()
в статическом методе: вы обязаны использовать его в методах экземпляра.С другой стороны, статический внутренний класс предназначен только для организационных целей (сказать, что оба класса связаны). Я адаптируюсь предыдущий пример со статическим внутренним классом:
public class ScreenCapture {
public static class CaptureButtonListener implements ClickListener {
protected ScreenCapture controller;
public CaptureButtonListener(ScreenCapture controller) {
this.controller = controller;
}
public void onClick(ClickEvent click) {
//..capture
controller.pressCount++;
}
}
Button button = new Button("capture");
int pressCount = 0;
public void captureRequested() {
//do capture...
pressCount++;
}
void addListeners() {
button.addClickListener(new CaptureButtonListener(this));
}
}
Обратите внимание, что в этом случае:
new ScreenCapture.CaptureButtonListener(screenCaptureInstance)
, что это связано с классом ScreenCapture (который улучшает читаемость кода)Теперь вы можете задаться вопросом, почему вы должны создать внутренний класс, не может получить доступ к своим полям владельца?вы правы: это не очень мудро в нашем случае, так как вы обязаны передать экземпляр ScreenCapture в конструктор (чтобы вы не могли использовать его ни с каким другим классом, кроме ScreenCapture). Это просто продемонстрировать разницу.
Следующий пример даст предыдущий весь свой смысл:
Вы можете объявить прослушивателя как общественный статический интерфейс внутри ScreenCapture
class ScreenCapture {
public static interface class CaptureRequestListener {
public void captureRequested(ClickEvent click);
}
}
Таким образом, вы могли бы передать реализации ScreenCapture «как обрабатывать запрос на захват "
Опять же, реализации интерфейса будут знать, что они реализуют что-то конкретное для ScreenCapture, поскольку они будут реализовывать
public class MyImpl implements ScreenCapture.CaptureRequestListener {
public void captureRequested(ClickEvent click) {
// I will count requests instead
}
}
Таким образом, ваш код более четкий, чем его наличие в отдельном классе для организации файлов.
Вы также можете иметь класс обработки базы (абстрактную реализацию общих задач, как внутренний класс)
Я надеюсь, что все было понятно :-) С наилучшими пожеланиями, Zied
Внутренние классы относятся к классу, который объявляет их, поэтому в зависимости от вашей сферы действия вы решите создать внутренний класс. Да, вы можете создать локальный класс, если область видимости локальна для метода, поэтому принятие решения зависит от области видимости.
Я бы рекомендовал читать следующее для большего понимания и знания URL
Внутренний класс может быть используется для достижения множественного наследования. Поэтому, если ваш класс уже расширяет один класс, вы можете расширить количество классов через внутренний класс.
Вы также должны проверить API-интерфейсы коллекции, чтобы увидеть его использование.
Примером может служить пользовательский 'Comparator'. –
http://www.javaworld.com/javaworld/javaqa/2000-03/02-qa-innerclass.html – JNL