我有一个类持有生成常数的大的安装这样:初始化大量的常量时,如何规避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