6

Очень плохой стиль для кодирования, но иногда неизбежный. Это крайний пример. Таким образом,Java: ограничение для классов гнезд?

  1. Есть ли ограничения для классов гнездования?
  2. они эквивалентны?
  3. как вы справляетесь с такими ситуациями? Создать библиотеку?

Код

new FileObject().new Format().new Words().new Some().new Continue someThing; 

((((new FileObject()).new Format()).new Words()).new Some()).new Continue someThing; 
+6

это всегда можно избежать – Bozho

+1

Является ли этот поставляемый код синтаксически правильным? – nmr

+0

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

ответ

5

Очень плохой стиль для кодирования, но иногда неизбежный.

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

Я не могу думать ни о каком разумном дизайн причина для гнездовых названий классов более одного уровня и анонимных классов более 3 или 4 уровней. (Я помню один раз, используя 3 или 4 уровня анонимных внутренних классов в приложении Eclipse RCP-с очень сложными обратными вызовами. Но это было очень необычно, и в ретроспективе это была плохая идея.)

1) является существует ли какой-либо предел для классов вложенности?

Теоретически предел - это ограничение на 64 КБ для полностью квалифицированных классов. На практике предел - это здравый смысл.

2) являются ли они эквивалентными?

Они? Если вы спрашиваете, являются ли вложенные классы эквивалентными не-вложенным классам, ответ Да ... для всех практических целей. Единственное, что вы можете делать с вложенными классами, которые не можете делать с обычными классами, - это поделиться вещами, объявленными как private. И обходной путь - это облегчить вам доступ к пакету.

3) как вы справляетесь с такими ситуациями? Создать библиотеку?

Я не знаю, в какой ситуации вы говорите. Обычный способ модуляции Java-программ, состоящих из нескольких классов, - это использование пакетов Java, а не кластеризации классов. Это то, чего вам не хватает?

3

пример вы даете не являются статическими вложенные классы. (Для создания экземпляра вложенного класса нужен объект типа охватывающего класса.) Вложенные нестатические классы используются редко. Обычно вы можете делать это со статическими вложенными классами или не вложенными классами с областью по умолчанию (пакет).

4

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

Не существует явного ограничения глубины вложенности. Наиболее важным неявным ограничением является имя сгенерированного файла .class, который реплицирует иерархию сдерживания, то есть FileObject$Format$Words$Some$Continue.class. В конечном итоге это приведет к ограничению длины файла, в зависимости от файловой системы.

+0

Хороший ответ, но я думаю, что методы доступа получаются только тогда, когда методы вложенного класса не являются частными. – helpermethod

+0

@helpermethod - это неверно. Доступ не имеет значения. Возможно, вы думаете о «статике». –

2

Как состояние в Inner Classes and Enclosing Instances (в спецификации langage), вложенный класс является своего рода статическим внутренним классом.

Так что я полагаю, что в вашем случае это внутреннее, а не гнездовое.

Во внутреннем случае я делаю какой-то заводский метод экземпляра в классе, потому что мне не нравится выражение new Toto(). New Foo() ... вы получаете объект foo, но где объект toto?

Для вложенных я делаю новый Toto.Foo.Bar.Other.And.So.On().

5

The Sun JVM имеет предел 65536 байт для полного имени класса закодированной в виде строки с использованием модифицированного UTF-8, как описано в «класс File Format » спецификации. Он исходит из 'u2' емкость (16 бит) - тип 'length' из константы 'CONSTANT_Utf8_info' структуры используется для хранения имен классов в классах файлов.

От maximum length for a java class name

Кроме того, формат банка (на основе почтового индекса) имеет максимальную длину имени файла также 64k. (Wikipedia, ZIP, File headers.) .)

Итак, предел для вложенности классов - это когда имя достигает 64k, но я думаю, что ваше здравомыслие может поразить его предел задолго до этого!

+0

Я хочу сказать длину имени файла, вот о чем вопрос, в сущности, о том, как долго может быть имя класса. Пределы формата zip содержат имена файлов до 64k (а не содержимое файла). – mdma

Смежные вопросы