我有一個類持有生成常數的大的安裝這樣:初始化大量的常量時,如何規避Java中的靜態初始化器的大小限制
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(...);
}
時產生的常數的數目是非常高,這會導致靜態初始化程序大於Java方法大小(即> 64kb)的上限,從而導致編譯器錯誤。一種解決方案是創建該可保證比的字節碼64KB產生較少的塊,以使得它們適合的方法的幾個「塊初始化方法」:
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(...);
}
}
這樣做的缺點是,我可以不再聲明常量爲final
,因爲它們現在不再直接在靜態初始化程序中初始化。
我的問題是,我怎樣才能規避編譯器/ JVM限制的方式,我仍然可以生成static final
常量?
你怎麼會運行到這個問題?這段代碼是從另一個文件自動生成的嗎? – templatetypedef
@templatetypedef:這是[jOOQ](http://www.jooq.org)的源代碼生成器中的一個實際錯誤。它從數據庫生成主鍵,唯一鍵和外鍵作爲常量對象。看起來2000個鍵對於jOOQ來說太多了:https://groups.google.com/d/topic/jooq-user/2g96fI1Yrj8/discussion –
你可以使用「虛擬」繼承層來做到這一點嗎?有一個基類,其中包含一些非公用名稱,其中包含1,000個常量,並有一個靜態初始化程序設置它們。那麼派生類又增加了1000個,派生類又增加了1000個,等等?除衍生程序集中的其他類以外,只有最派生的類纔會用於任何目的。 – supercat