Comments 20
Теоретически — до 21_845 элементов максимум, на практике это число ещё меньше
С чего вы взяли что около 20000? 8192 это все же до 21845, так что в принципе друг другу эти заключения не противоречат
21_845 это оценка сверху при следующих допущениях:
- Для полной инициализации одного элемента перечисления нужна только инструкции
putstatic
- Более выгодного по размеру кода способа инициализировать
static final
поле нет
Первое утверждение неверно, как и указано в статье:
На самом деле эта оценка завышена. Значение для записи в поле инструкция берёт с вершины стека, которое туда поместила одна из предыдущих инструкций. И эта инструкция тоже занимает драгоценные байты.
Как дело обстоит со вторым пунктом сейчас и в вероятном будущем — узнаете из заключительной статьи цикла.
Число 8_191 у автора твита получилось после дополнительных оптимизаций, которые не делает javac
.
Наверное, об этом будет часть 2
Судя по листингу, на инициализацию одного поля уходит 13 байт инструкций и ещё 6 байт на заполнение массива. Поэтому больше 3500 значений не должно быть, если только компилятор не генерирует другой код для больших перечислений.
После установления точной границы интересное предложение исследования — сделать хотя бы один свитч по этому енаму. Хоть бы и пустой. Сработает? Или придётся лимит ещё снижать?
Для каждого свича делать свой анонимный класс)
А вместо кода в ветках вызывать методы родительского класса — их вполне может быть 8к.
Один switch
со всеми элементами?
Так-то можно обрабатывать фрагментами, помещая в ветку default
вызов метода с обработкой следующего фрагмента.
С ходу можно прикинуть:
Пропусков у ordinal()
нет, заголовок у tableswitch
занимает ~16 байтов, дальше — по 4 байта на каждый вариант. Плюс, как минимум, aload_<n>
и invokevirtual OurEnum::ordinal()
в начале и return
в конце.
(65_535 - 16 - 1 - 1 - 3) / 4 ~ 16_378
элементов, дальше будет Code too large
.
Интрига в том, сможем ли мы дойти до этого числа.
Убрал под спойлер из уважения к автору этой статьи, так как он обещает продолжение
Продолжение: Максимальное количество значений в enum Часть II
Максимальное количество значений в enum Часть I