Ho una classe in possesso di un grande un monte di costanti generati in quanto tale:Come aggirare il limite di dimensione di un initialiser statica in Java quando l'inizializzazione di grandi quantità di costanti
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(...);
}
Quando il numero di costanti generati è molto alto, questo si traduce in un inizializzatore statico che è maggiore del limite superiore per le dimensioni del metodo Java (cioè> 64kb), provocando un errore del compilatore. Una soluzione è quella di creare diversi "metodi di inizializzazione blocco" per blocchi che possono essere garantiti per produrre meno di 64kb di byte-code, in modo tale che si inseriscono in un metodo:
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(...);
}
}
Lo svantaggio di questo è che posso non dichiarare più le costanti come final
, perché ora non sono più inizializzate direttamente nell'inizializzatore statico.
La mia domanda è: come posso aggirare la limitazione del compilatore/JVM in modo che sia possibile generare costanti static final
?
Come hai fatto a finire in esecuzione in questo problema? Questo codice è generato da un altro file? – templatetypedef
@templatetypedef: questo è un bug reale nel generatore del codice sorgente di [jOOQ] (http://www.jooq.org). Genera chiavi primarie, chiavi univoche e chiavi esterne come oggetti costanti da un database. Sembra che le 2000 chiavi siano troppo per gestire jOOQ: https://groups.google.com/d/topic/jooq-user/2g96fI1Yrj8/discussion –
Potresti usare strati di ereditarietà "fittizi" per questo? Avere una classe base con un nome non pubblico che contiene 1.000 costanti e ha un inizializzatore statico impostato. Quindi una classe derivata che aggiunge altri 1.000, una classe subderived che aggiunge un altro 1,000, ecc.? Solo la classe più derivata sarebbe mai stata utilizzata per qualsiasi scopo tranne che per la derivazione delle altre classi nell'assembly. – supercat