gpt4 book ai didi

java - 初始化大量常量时如何规避 Java 中静态初始化器的大小限制

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:40 29 4
gpt4 key购买 nike

我有一个包含大量生成常量的类:

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 的字节码的 block 创建多个“ block 初始化方法”,以便它们适合一个方法:

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 限制?

最佳答案

一个选择是使用继承——有一系列的类 Constants1, Constants2, ..., ConstantsN 它们都定义了常量,然后让每一个都继承前一个。最终类 Constants 可以直接继承自最后一个类。这也让您可以将所有内容标记为 final

出于好奇,您是如何得到一个大到无法将初始化代码放入 64KB 限制的文件?

希望这对您有所帮助!

关于java - 初始化大量常量时如何规避 Java 中静态初始化器的大小限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10841732/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com