Каковы возможности использования внутренних классов в Java? Являются ли вложенные классы и внутренние классы одинаковыми?
Ответ 2
Разница хорошо решена другим ответом. Что касается их использования/релевантности, вот мое мнение:
Анонимный класс: удобный для производительности
Они удобны для быстрого выполнения обратных вызовов, без нагрузки для создания нового именованного класса.
button.addActionListener(
new ActionListener() {
public void actionPerformed( ActionEvent e ) {
frame.dispose();
}
}
);
Они также удобны для потоковой передачи (например, анонимного Runnable
) и нескольких других аналогичных шаблонов.
Статический вложенный класс: удобный для инкапсуляции
Статические вложенные классы по существу похожи на обычные классы, за исключением того, что их имя OuterClass.StaticNestedClass
, и вы можете играть с модификатором. Таким образом, он предоставил некоторую форму инкапсуляции, которая не может быть точно достигнута с помощью классов верхнего уровня.
Подумайте, например, о LinkedList
, для которого вы хотели бы, чтобы класс Node
(используемый только внутренне) не был видимым в представлении пакета. Сделайте его статическим вложенным классом, чтобы он полностью был встроен в LinkedList
.
Внутренний класс: удобный для собственности и инкапсуляции
Экземпляр внутреннего класса имеет доступ к полю его экземпляра окружающего класса. Подумайте еще раз о связанном списке и представьте, что Node
- это внутренний класс:
public class LinkedList {
private Node root = null;
public class Node {
private Object obj;
private Node next;
...
public void setAsRoot() {
root = this;
}
}
public Node getRoot() {
return root;
}
public void setRoot( Node node ) {
root = node;
}
}
Каждый экземпляр Node
, принадлежащий LinkedList
, может обращаться к нему напрямую. Между списком и его узлами подразумевается неявное отношение собственности; список принадлежит своим узлам. Для того же отношения с владельцем потребуется дополнительный код, если он будет реализован с помощью обычных классов.
См. Достичь лучшего кода Java с внутренними и анонимными классами