Перечисления определенно имеют ограничения, с основным (жестким) ограничением около 32К значенийНа них распространяются максимумы класса Java как на «постоянный пул» (записи 64 КБ), так и - в некоторых версиях компилятора - на ограничение размера метода (64 КБ байт-кода) на статическом инициализаторе.
'Enumвнутренняя инициализация, использует две константы для каждого значения - FieldRef и строку Utf8.Это дает «жесткий предел» в значениях ~ 32K.
Старые компиляторы (по крайней мере, Eclipse Indigo) также сталкиваются с проблемой размера метода статического инициализатора.С 24 байтами байтового кода требуется для создания экземпляра каждого значения и добавления его в массив значений.может встретиться ограничение в 2730 значений.
Более новые компиляторы (по крайней мере, JDK 7) автоматически разбивают большие статические инициализаторы на методы с именами " enum constant initialization$2"
, " enum constant initialization$3"
и т. д., поэтому не подпадают под второе ограничение.
Вы можете разобрать байт-код с помощью javap -v -c YourEnum.class
, чтобы увидеть, как это работает.
[Теоретически возможно написать класс Enum "старого стиля" как Java-код с ручной кодировкой, чтобы разбить 32Kограничить и приблизиться к значениям 64К.Подход заключается в том, чтобы инициализировать значения перечисления отражением , чтобы избежать необходимости использования строковых констант в пуле.Я протестировал этот подход, и он работает в Java 7, но желательность такого подхода (вопросы безопасности) сомнительны.]
Примечание для редакторов: Utf8 был внутренним типом в файле классов Java IIRC,это не опечатка, которую нужно исправить.