Это не простое решение, но вы можете попытаться ... пропатчить компилятор Java.
Когда вы пишете enum
, компилятор Java генерирует класс, который расширяет java.lang.Enum
(возможно, несколько классов, если существуют методы, специфичные для констант). Класс имеет некоторые (скрытые) статические поля, которые на уровне байт-кода инициализируются специальным методом <clinit>()
(который JVM вызывает при первом использовании класса). Как и любой другой метод, код для метода <clinit>()
ограничен 65535 байтами. Каждая константа вносит примерно 20-22 байта в байт-код <clinit>()
(больше, если есть конструкторы, специфичные для констант), поэтому вы достигнете предела примерно 3000 констант перечисления.
Теперь у метода <clinit>()
есть забавное имя, но в нем нет ничего особенного; он может вызывать другие методы. Компилятор Java может разделить мамонта <clinit>()
на несколько скрытых под-методов, которые <clinit>()
будут вызывать один за другим. Компилятор Java в настоящее время не делает этого, но теоретически может. Результат будет обработан любым JRE.
В качестве альтернативы, вы можете синтезировать класс enum синтетически, генерируя байт-код из специальной программы, возможно, написанной на Java. По сути, это похоже на написание собственного специализированного компилятора для конкретной цели и использование собственного синтаксиса исходного кода. Библиотека BCEL может помочь.
Обратите внимание, что есть и другие ограничения, которые могут на вас повлиять. Для каждой константы перечисления в статическом коде (в <clinit>()
) используются две «константы», которые являются внутренними значениями, агрегированными в части «пул констант» скомпилированного класса. Два значения - это имя константы (в виде строки) и результирующая ссылка на статическое поле. Существует жесткое ограничение на 65536 записей пула констант (индексы на 16 битах), поэтому не более 32 000 констант перечисления. Запатентованный компилятор Java может обойти это ограничение, создав несколько скрытых классов, каждый со своим собственным пулом констант. Более жесткое ограничение - количество статических полей: каждая константа перечисления становится статическим полем в классе «enum», и в классе может быть не более 65535 полей (статических или нет).