gpt4 book ai didi

java - 枚举超过静态初始化程序的 65535 字节限制......最好做什么?

转载 作者:太空狗 更新时间:2023-10-29 22:34:54 24 4
gpt4 key购买 nike

我已经启动了一个相当大的所谓描述符 枚举,我想将其用作模型中的引用列表。但现在我第一次遇到了编译器/VM 限制,所以我正在寻找处理这个问题的最佳解决方案。

这是我的错误:静态初始化程序的代码超出了 65535 字节的限制

很明显这是从哪里来的——我的 Enum 有太多的元素。但我需要这些元素 - 没有办法减少该集合。

最初我计划使用单个枚举,因为我想确保枚举中的所有元素都是唯一的。它用于 Hibernate 持久性上下文,其中对枚举的引用作为字符串值存储在数据库中。所以这一定是独一无二的!

我的 Enum 的内容可以分为几组属于一起的元素。但是拆分 Enum 会消除我在编译时获得的独特安全性。或者这可以通过某种方式使用多个枚举来实现吗?

我目前唯一的想法是定义一些名为Descriptor 的接口(interface),并编写几个实现它的枚举。这样我希望能够像使用单个 Enum 一样使用 Hibernate Enum 映射。但我什至不确定这是否有效。我失去了独特的安全感。

对如何处理该案例有任何想法吗?

最佳答案

简单。不要为此使用 enum。你不能。这是行不通的。

您的源代码很可能没有明确引用许多枚举值。相反,您使用枚举作为在唯一对象实例和字符串名称之间进行映射的便捷方式。因此,只需将枚举类型替换为显式管理映射的类型,通过从文件或数据库中读取来初始化它。如果你做对了,你将获得枚举的计算属性和类型安全性。您唯一失去的是语法糖……和静态。

这种方法还有一个额外的好处,即您可以修改“描述符”映射,而无需修改程序的源代码。


顺便说一下,您遇到的限制是由 JVM 类文件格式强加的。方法或构造函数的大小上限为 2^16 字节,类静态初始化代码表示为具有时髦名称的特殊方法。

更新

不幸的是,您的自答解决方案仍将遇到不同的 64K 限制……如果推得太远。拆分 initialize() 方法可以绕过方法大小限制,但类常量池中的条目数也有 64K 的限制。每个字符串文字都需要一个常量池条目。

关于java - 枚举超过静态初始化程序的 65535 字节限制......最好做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2546470/

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