我有一个类包含大量生成的常量,例如:
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
,因为它们现在不再直接在静态初始化程序中初始化。
我的问题是,如何以仍然可以生成static final
常量的方式规避编译器/JVM 限制?