tengo una clase que sostiene una montura grande de constantes generados como tal:Cómo eludir el límite de tamaño de un inicializador estático en Java para inicializar grandes cantidades de constantes
public class Constants extends SomeBaseClass {
// init() is defined in some base class...
public static final XXX KEY1 = init(...);
public static final XXX KEY2 = init(...);
public static final XXX KEY3 = init(...);
// ...
public static final XXX KEY2000 = init(...);
}
Cuando el número de constantes generados es muy alto, esto da como resultado un inicializador estático que es mayor que el límite superior para los tamaños de método de Java (es decir,> 64 kb), lo que da como resultado un error de compilación. Una solución es crear varios "métodos de inicialización de bloque" para bloques que pueden ser garantizados para producir menos de 64kb de código de bytes, de tal forma que encajan en un método:
public class Constants extends SomeBaseClass {
public static XXX KEY1;
public static XXX KEY2;
public static XXX KEY3;
// ...
public static XXX KEY2000;
static {
initialise0001To1000();
initialise1001To2000();
}
private static void initialise0001To1000() {
KEY1 = init(...);
KEY2 = init(...);
KEY3 = init(...);
// ...
}
private static void initialise1001To2000() {
// ...
KEY2000 = init(...);
}
}
El inconveniente de esto es que lo que pueda ya no declara las constantes como final
, porque ya no se inicializan directamente en el inicializador estático.
Mi pregunta es, ¿cómo puedo eludir esa limitación de compilador/JVM de manera que todavía puedo generar constantes static final
?
¿Cómo terminó corriendo en este problema? ¿Es este código autogenerado desde otro archivo? – templatetypedef
@templatetypedef: Este es un error real en el generador de código fuente de [jOOQ] (http://www.jooq.org). Genera claves primarias, claves únicas y claves foráneas como objetos constantes de una base de datos. Parece que 2000 claves son demasiado para que lo maneje jOOQ: https://groups.google.com/d/topic/jooq-user/2g96fI1Yrj8/discussion –
¿Podría usar capas de herencia "ficticias" para esto? Tener una clase base con algún nombre que no sea de uso público que contenga 1000 constantes y tenga un inicializador estático configurado. ¿Entonces una clase derivada que agrega 1,000 más, una clase subderivada que agrega otros 1,000, etc.? Solo la clase más derivada se usará para cualquier propósito, excepto para la derivación de las otras clases en el ensamblado. – supercat