Las enumeraciones definitivamente tienen límites, sin el límite primario (difícil) alrededor de 32K. Están sujetos a los máximos de clase Java, tanto del "grupo constante" (entradas 64K) como, en algunas versiones del compilador, al límite de tamaño del método (código de bytes 64K) en el inicializador estático.
Inicialización 'Enum' internamente, utiliza dos constantes por valor: una cadena FieldRef y una cadena Utf8. Esto da el "límite duro" en ~ 32K valores.
Los compiladores antiguos (al menos Eclipse Indigo) también tienen un problema con el tamaño del método del inicializador estático. Con 24 bytes de bytecode necesarios para crear una instancia de cada valor &, agréguelo a la matriz de valores. se puede encontrar un límite de alrededor de 2730 valores.
Los compiladores más nuevos (al menos JDK 7) dividen automáticamente inicializadores estáticos grandes en los métodos denominados " enum constant initialization$2"
, " enum constant initialization$3"
etc. por lo que no están sujetos al segundo límite.
Puede desmontar bytecode a través del javap -v -c YourEnum.class
para ver cómo funciona esto.
[Podría ser teóricamente posible escribir una clase Enum "antigua" como una codificación manual de Java, para romper el límite de 32K y acercarse a valores de 64K. El enfoque sería inicializar los valores enum por reflexión para evitar la necesidad de contar con constantes de cadena en el conjunto. Probé este enfoque y funciona en Java 7, pero la conveniencia de tal enfoque (problemas de seguridad) es cuestionable.]
Probablemente menos de 4 mil millones. – Robert
No tengo ni idea, pero me gustaría saber qué tipo de código estás pensando que requeriría saber el tamaño máximo de una enumeración lol –
Si veo un cambio con 2 mil millones de casos, probablemente mate a cualquiera que tenga tocó ese código. – Bozho