Статический вложенный класс в Java, почему?

208
задан Peter Mortensen 23 January 2011 в 06:38
поделиться

7 ответов

Страница Sun, с которой Вы связываетесь, имеет некоторые основные отличия между двумя:

вложенный класс А является членом своего класса включения. Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам класса включения, даже если они объявляются частные. Статические вложенные классы не имеют доступа к другим членам класса включения.
...

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

нет никакой потребности в LinkedList.Entry, чтобы быть классом верхнего уровня, как это [только 117] используемые LinkedList (существуют некоторые другие интерфейсы, которые также имеют статические вложенные классы, названные Entry, такой как Map.Entry - то же понятие). И так как этому не нужен доступ к членам LinkedList, имеет смысл для него быть статичным - это - намного более чистый подход.

Как Jon Skeet указывает , я думаю, что это - лучшая идея при использовании вложенного класса, должен начаться с ним являющийся статичным, и затем решить, должно ли это действительно быть нестатично на основе использования.

265
ответ дан Community 23 November 2019 в 04:41
поделиться

Я не знаю о различии в производительности, но как Вы говорите, статический вложенный класс не является частью экземпляра класса включения. Кажется просто более простым создать статический вложенный класс, если Вам действительно не нужен он, чтобы быть внутренним классом.

Это немного похоже, почему я всегда делаю свой финал переменных в Java - если они не являются окончательными, я знаю, что существует что-то забавное продолжение их. При использовании внутреннего класса вместо статического вложенного класса должно быть серьезное основание.

0
ответ дан 23 November 2019 в 04:41
поделиться

Простой пример:

package test;

public class UpperClass {
public static class StaticInnerClass {}

public class InnerClass {}

public static void main(String[] args) {
    // works
    StaticInnerClass stat = new StaticInnerClass();
    // doesn't compile
    InnerClass inner = new InnerClass();
}
}

, Если нестатичный кроме класса нельзя инстанцировать в экземпляре высшего сословия (так не в примере, где основной статическая функция)

4
ответ дан Jim Ferrans 23 November 2019 в 04:41
поделиться

Одна из причин помех по сравнению с нормальным имеет отношение к classloading. Вы не можете инстанцировать внутреннего класса в конструкторе, он - родитель.

пз: я всегда понимал 'вложенный' и 'внутренний', чтобы быть взаимозаменяемым. Могут быть тонкие нюансы в терминах, но большинство Java-разработчиков поняло бы также.

2
ответ дан Mark Renouf 23 November 2019 в 04:41
поделиться

Существуют неочевидные проблемы удержания памяти для принятия во внимание здесь. Так как нестатический внутренний класс поддерживает неявную ссылку на, он - 'внешний' класс, если на экземпляр внутреннего класса сильно ссылаются, то на внешний экземпляр сильно ссылаются также. Это может привести к некоторому царапанию головы, когда внешний класс не собран "мусор", даже при том, что это появляется , что ничто не ссылается на него.

26
ответ дан Leigh 23 November 2019 в 04:41
поделиться

Ну, с одной стороны, нестатические внутренние классы имеют дополнительное, скрытое поле, которое указывает на экземпляр внешнего класса. Таким образом, если бы класс Записи не был статичен, то помимо наличия доступа, в котором это не нуждается, он нес бы приблизительно четыре указателя вместо три.

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

10
ответ дан 23 November 2019 в 04:41
поделиться

По моему мнению вопрос должен быть наоборот каждый раз, когда Вы видите, что внутренний класс - делает это действительно потребность быть внутренним классом, с дополнительной сложностью и неявным (а не явный и более ясный, IMO) ссылка на экземпляр содержания класса?

Мышление Вы, я смещаюсь как вентилятор C# - C# не имеет эквивалента внутренних классов, хотя это действительно имеет вложенные типы. Я не могу сказать, что пропустил внутренние классы все же:)

44
ответ дан Jon Skeet 23 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: