среда, 1 августа 2012 г.

OOP: inner/nested


Терминология Java Lang Spec в этой части достаточно запутана. Авторы различают nested (§8), inner (§8.1.3), local (§14.3), member (§8.5, §9.5), anonimous (§15.9) classes.

Мы следуем терминологии Java Lang Spec, но будем рассматривать только static-nested/innes + anonimous classes.

    nested / inner classes

    "A nested class is any class whose declaration occurs within the body of another class or interface."
    "An inner class is a nested class that is not explicitly or implicitly declared static."

inner classses - это подмножество nested classes, называемое non-static nested class
дополнением inner classses (=non-static nested class) до nested classes являются static nested classes


inner class == non-static nested class
nested classes \ inner classes == static nested class

1. Нарушение инкапсуляции: и inner classes (non-static nested classes) и static nested classes имеют доступ ко всем членам outer class с любыми модификаторами доступа (public, protected, package private(=default), private).

2. Неявная ссылка на экземпляр outer-класса:
    Следствия:
    2.1. Если сохранилась ссылка на inner class, то не может быть удален outer class
    2.2. Не можем создать экземпляр inner class, не имея экземпляр outer class
    Уточнение:
    2.3. У одного экземпляра inner class есть только один непосредственный экземпляр outer class, но у экземпляра outer class может быть 0, 1, 2, ... любое количество экземпляров inner class. 
    2.4. Почему ссылаемые ?сущности? должны быть final? Где хранятся переменные из стека?


3. Имя класса: и для inner (=non-static nested) и для static nested классов полное имя класса включает имя outer класса.
    Следствия: