为什么"final static int"可以用作switch的case常量而不是"final static <your enum>"

pak*_*man 20 java enums constants case switch-statement

为什么这个int开关有效:


public class Foo {
    private final static int ONE = 1;
    private final static int TWO = 2;

    public static void main(String[] args) {
        int value = 1;
        switch (value) {
            case ONE: break;
            case TWO: break;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

虽然这个枚举开关不是:


import java.lang.annotation.RetentionPolicy;

public class Foo {
    private final static RetentionPolicy RT = RetentionPolicy.RUNTIME;
    private final static RetentionPolicy SRC = RetentionPolicy.SOURCE;

    public static void main(String[] args) {
        RetentionPolicy value = RetentionPolicy.RUNTIME;
        switch (value) {
            case RT: break;
            case SRC: break;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我知道在这种情况下必须是一个常量,为什么我可以使用"final static int"作为常量而不是"final static <your enum>"?

ILM*_*tan 18

因为case语句标签必须具有编译时常量或EnumConstantName.JLS 14.11

编译时间常量只能是字符串和基本类型,如JLS 15.28所述.因此,您不能使用静态final <your enum>,因为它既不是编译时常量,也不是枚举的名称.


Cam*_*ner 8

case参数必须是原始的; 它不能成为一个对象.

但是,您可以按如下方式使用枚举:

RetentionPolicy value = ...
switch (value) {
    case RUNTIME:
    case SOURCE:
}
Run Code Online (Sandbox Code Playgroud)

因为value声明属于类型RetentionPolicy,所以可以直接在开关内使用枚举常量.

  • @Michael:OP使用最终的静态变量而不是直接引用枚举常量. (3认同)