java - Java 枚举中可以拥有的成员数量有多少限制?

标签 java performance compiler-construction enums runtime

假设您在 Java 中有一个这样的假设枚举(纯粹出于演示目的,这不是我真正希望使用的代码):

enum Example{
    FIRST,
    SECOND,
    THIRD,
    ...
    LAST;
}

在编译器停止之前,枚举中最多可以包含多少成员?

其次,当您的代码引用具有 10 个成员而不是 100 或 1,000 个成员的枚举时(除了存储大型类所需的明显内存开销之外),在运行时是否存在任何性能差异?

最佳答案

语言规范本身没有限制。然而,类文件有许多限制枚举数量的限制,上限为 65,536 (2^16) 个枚举:

字段数 JVMS 4.1指定 ClassFile 最多可以有 65,536 (2^16) 个字段。枚举作为静态字段存储在类文件中,因此枚举值和枚举成员字段的最大数量为 65,536。

常量池 JVMS 还规定 Constant Pool 最多可以有 65,536 个。常量池存储所有字符串文字、类型文字、父类(super class)型、超接口(interface)类型、方法签名、方法名称、AND 枚举值名称。因此必须少于 2^16 个枚举值,因为名称字符串需要共享常量池限制。

静态方法初始化 方法的最大限制是 65,535 字节(字节码)。因此 Enum 的静态初始值设定项必须小于 64Kb。虽然编译器可能会将其拆分为不同的方法(请参阅 Bug ID: 4262078)以将初始化分布到小块中,但编译器目前不会这样做。

长话短说,没有简单的答案,答案不仅取决于枚举值的数量,还取决于枚举具有的方法、接口(interface)和字段的数量!

关于java - Java 枚举中可以拥有的成员数量有多少限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823346/

相关文章:

mysql - 我怎样才能改进这个 4 计数自连接?

c - 关于 C 编译器 asm 输出的另一个问题

c - 全局 const 优化和符号插入

syntax - 静态语义的含义?

带有形状体积和面积类的 Java 接口(interface)

java - 构造函数中的数组列表元素不等于函数中的数组列表元素

java - XML 解析 - 搜索特定元素

java - Java AES/CBC 解密后的初始字节不正确

sql - 使用 SQL Server 进行性能调整

javascript - 在javascript中编写 parent 的 child 的有效方式