Java 中枚举元素的最大数量

2022-09-01 08:12:59

在Java中,枚举中允许的最大元素数是多少?

我想找出 switch 语句中的最大事例数。由于 switch 中允许的最大基元类型是 int,因此我们有从 -2,147,483,648 到 2,147,483,647 的案例和一个默认情况。但是,枚举也是允许的...所以问题..


答案 1

类文件格式规范中

ClassFile 结构的 16 位constant_pool_count字段 (§4.1) 将每个类或每个接口的常量池限制为 65535 个条目。这充当对单个类或接口的总复杂性的内部限制。

我相信这意味着你不能在单个类中有超过65535个命名的“事物”,这也将限制枚举常量的数量。

如果看到一个有20亿个案例的开关,我可能会杀死任何接触过该代码的人。

幸运的是,这不会发生:

每个非本机、非抽象方法的代码量由 Code 属性exception_table (§4.7.3)、LineNumberTable 属性 (§4.7.8) 和 LocalVariableTable 属性 (§4.7.9) 中的索引大小限制为 65536 字节。


答案 2

枚举元素的最大数目为 2746。阅读规范非常具有误导性,并导致我创建一个有缺陷的设计,假设我永远不会达到64K甚至32K高水位线。不幸的是,这个数字远低于规格似乎表明的。作为测试,我尝试了Java 7和Java 8的以下方法:运行以下代码将其重定向到文件,然后编译生成的.java文件。

    System.out.println("public enum EnumSizeTest {");
    int max = 2746;
    for ( int i=0; i<max; i++) {
        System.out.println("VAR"+i+",");
    }
    System.out.println("VAR"+max+"}");

结果,2746 有效,2747 不起作用。

在 2746 个条目之后,编译器会抛出代码过大的错误,例如

EnumSizeTest.java:2:错误:代码太大

反编译此 Enum 类文件时,限制似乎是由为静态构造函数中的每个枚举值生成的代码(主要是)引起的。