为什么枚举不是常数表达式?

时间:2017-04-16 21:42:39

标签: java enums

看看这段代码:

public class TestClass {
    public static void main(final String[] args) {
        switch (0) {
        case MyEnum.Test.ordinal():
            break;
        }
    }

    public static enum MyEnum {
        Test;
    }
}

此代码无法使用错误消息进行编译:

  

case表达式必须是常量表达式。

这是因为MyEnum.Test.ordinal()不是常数。根据{{​​3}},ordinal()方法执行此操作:

  

返回此枚举常量的序数(它在枚举声明中的位置,其中初始常量的序数为零)。

那么为什么序数不变?恩欧姆的位置不是一成不变的吗?这里发生了什么?

2 个答案:

答案 0 :(得分:1)

方法的结果永远不是编译时常量。 ordinal()绝不是特别的,它就像所有其他(实例)方法一样。

您可以找到表达式类型列表,它们可以是编译时常量in the language spec

答案 1 :(得分:1)

Enum.ordinal()是一个功能。函数调用永远不能是编译时常量。 (甚至没有关闭。)

该语言的创建者可能已经选择引入一个特殊的关键字而不是一个函数来获取Enum的序数(可能Enum.ordinal就像Object.class)但我想他们决定了反对它,因为

a)它不必要地使语言复杂化,

b)它没有提供任何你通过其他方式无法轻易完成的事情。

c)来自ordinal()的文档:“大多数程序员都不会使用这种方法。它被设计用于复杂的基于枚举的数据结构,例如EnumSet和EnumMap。”

在您的示例中,您可以尝试将int转换为enum的实例,然后通过实际实例转换为switch