Mam klasy gospodarstwa dużą wierzchowca generowanych stałych jako takie:Jak obejść limit rozmiaru statycznym initialiser w Javie przy inicjalizacji duże ilości stałych
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(...);
}
Gdy liczba generowanych stałych jest bardzo wysoka, powoduje to statyczny inicjator, który jest większy niż górny limit dla metod Java (tj.> 64kb), powodując błąd kompilatora. Jednym rozwiązaniem jest utworzenie kilku „metody inicjalizacji bloków” dla bloków, które może być zagwarantowane, aby wytworzyć mniej niż 64kb bajtu kodu, tak, że pasują do metody:
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(...);
}
}
Wadą jest to, że mogę nie deklarujemy już stałych jako final
, ponieważ nie są one już inicjalizowane bezpośrednio w statycznym inicjatorze.
Moje pytanie brzmi: jak mogę ominąć to ograniczenie kompilatora/maszyny JVM w sposób, w jaki nadal mogę generować stałe static final
?
Jak skończyć z systemem do tego problemu? Czy ten kod jest automatycznie generowany z innego pliku? – templatetypedef
@templatetypedef: To jest prawdziwy błąd w generatorze kodu źródłowego [jOOQ] (http://www.jooq.org). Generuje klucze podstawowe, klucze unikalne i klucze obce jako stałe obiekty z bazy danych. Wygląda na to, że 2000 kluczy to zbyt wiele dla jOOQ do obsłużenia: https://groups.google.com/d/topic/jooq-user/2g96fI1Yrj8/discussion –
Czy możesz użyć do tego celu "atrapowych" warstw dziedziczenia? Posiadaj klasę podstawową z pewną nazwą niepubliczną, która zawiera 1000 stałych i ma ustawiony statyczny inicjator. Następnie klasa pochodna, która dodaje 1000 więcej, klasa z subdomenami, która dodaje kolejne 1000 itd.? Tylko klasa pochodna byłaby kiedykolwiek używana do jakichkolwiek celów, z wyjątkiem wyprowadzania innych klas w zespole. – supercat