recorrer - java enum with values
Número máximo de elementos enum en Java (7)
Bueno, en jdk1.6 llegué a este límite. Alguien tiene 10,000 enumeración en un xsd y cuando generamos, obtenemos un archivo de enumeración de 60,000 líneas y recibo un error de compilador Java de
[ERROR] Error al ejecutar el objetivo org.apache.maven.plugins: maven-compiler-plugin: 2.0.2: compilar (compilación predeterminada) en el marco del proyecto: Error de compilación [ERROR] / Users / dhiller / Space / ifp-core /framework/target/generated-sources/com/framework/util/LanguageCodeSimpleType.java:[7627,4] código demasiado grande
posiblemente el límite sea mucho más bajo que las otras respuestas aquí O quizás los comentarios y los que se generan están ocupando demasiado espacio. Tenga en cuenta que el número de línea es 7627 en el error del compilador de Java, aunque si el límite de línea es 7627, me pregunto cuál es el límite de longitud de la línea;) que puede ser similar. es decir. los límites pueden no basarse en el número de enumeraciones, sino en los límites de longitud de línea o en el número de líneas en el límite del archivo, por lo que debería cambiar el nombre de enumeraciones a A, B, etc. para que sean muy pequeñas para incluir más enumeraciones en la enumeración.
No puedo creer que alguien haya escrito un xsd con 10,000 enumeración ... deben haber generado esta parte del xsd.
¿Cuál es el número máximo de elementos permitidos en una enumeración en Java?
Quería averiguar el número máximo de casos en una declaración de cambio. Dado que el tipo primitivo más grande permitido en switch es int, tenemos casos desde -2,147,483,648 a 2,147,483,647 y un caso predeterminado. Sin embargo, las enumeraciones también están permitidas ... así que la pregunta ..
De la especificación de formato de archivo de clase :
El grupo de constantes por clase o por interfaz está limitado a 65535 entradas por el campo constant_pool_count de 16 bits de la estructura de ClassFile (§4.1). Esto actúa como un límite interno en la complejidad total de una sola clase o interfaz.
Creo que esto implica que no puedes tener más de 65535 con el nombre de "cosas" en una sola clase, lo que también limitaría el número de constantes de enumeración.
Si veo un interruptor con 2 mil millones de casos, probablemente mataré a cualquiera que haya tocado ese código.
Afortunadamente, eso no puede suceder
La cantidad de código por método no nativo, no abstracto está limitada a 65536 bytes por el tamaño de los índices en la tabla de excepción del atributo Código (§4.7.3), en el atributo LineNumberTable (§4.7.8), y en el atributo LocalVariableTable (§4.7.9).
El número máximo de elementos de enumeración es 2746. La lectura de la especificación fue muy engañosa y me hizo crear un diseño defectuoso con el supuesto de que nunca alcanzaría la marca de agua de 64K o incluso de 32K. Desafortunadamente, el número es mucho más bajo de lo que parece indicar la especificación. Como prueba, probé lo siguiente con Java 7 y Java 8: corrí el siguiente código redirigiéndolo a un archivo, luego compilé el archivo .java resultante.
System.out.println("public enum EnumSizeTest {");
int max = 2746;
for ( int i=0; i<max; i++) {
System.out.println("VAR"+i+",");
}
System.out.println("VAR"+max+"}");
Resultado, 2746 obras, y 2747 no.
Después de 2746 entradas, el compilador lanza un error de código demasiado grande, como
EnumSizeTest.java:2: error: código demasiado grande
Al descompilar este archivo de clase Enum, la restricción parece estar causada por el código generado para cada valor enum en el constructor estático (en su mayoría).
El tamaño máximo de cualquier método en Java es de 65536 bytes. Si bien teóricamente puedes tener un interruptor grande o más valores de enumeración, es el tamaño máximo de un método al que probablemente llegues primero.
La clase Enum
usa un int
para rastrear los valores ordinales de cada valor, por lo que el máximo sería el mismo que int en el mejor de los casos, si no mucho más bajo.
Y como han dicho otros, si tiene que preguntar, lo está haciendo mal.
Las enumeraciones definitivamente tienen límites, con el límite primario (difícil) alrededor de los valores de 32K. Están sujetos a los máximos de clase Java, tanto del ''grupo constante'' (entradas de 64K) como, en algunas versiones del compilador, a un límite de tamaño de método (64K bytecode) en el inicializador estático.
La inicialización ''Enum'' internamente, usa dos constantes por valor: una FieldRef y una cadena Utf8. Esto da el "límite duro" en valores ~ 32K.
Los compiladores más antiguos (al menos Eclipse Indigo) también tienen problemas con el tamaño del método del inicializador estático. Con 24 bytes de bytecode requerido para instanciar cada valor y agregarlo a la matriz de valores. Puede encontrarse un límite alrededor de 2730 valores.
Los compiladores más nuevos (al menos JDK 7) dividen los inicializadores estáticos grandes en métodos llamados " enum constant initialization$2"
, " enum constant initialization$3"
etc., por lo que no están sujetos al segundo límite.
Puede desarmar el bytecode a través de javap -v -c YourEnum.class
para ver cómo funciona esto.
[Podría ser teóricamente posible escribir una clase Enum de "estilo antiguo" como Java codificada a mano, para romper el límite de 32K y acercarse a los valores de 64K. El enfoque sería inicializar los valores de enumeración por reflexión para evitar la necesidad de 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.]
Nota para los editores: Utf8 era un tipo interno en el archivo de clase de Java IIRC, no es un error tipográfico que deba corregirse.
No hay un número máximo por sí mismo para ningún propósito práctico. Si necesita definir miles de enumeraciones en una clase, debe volver a escribir su programa.