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>,因为它既不是编译时常量,也不是枚举的名称.
case参数必须是原始的; 它不能成为一个对象.
但是,您可以按如下方式使用枚举:
RetentionPolicy value = ...
switch (value) {
case RUNTIME:
case SOURCE:
}
Run Code Online (Sandbox Code Playgroud)
因为value声明属于类型RetentionPolicy,所以可以直接在开关内使用枚举常量.
| 归档时间: |
|
| 查看次数: |
16105 次 |
| 最近记录: |