【Java】Constant expression required

问题描述

在JDK1.8下使用switch...case...语句,switch条件为String类型,case值为枚举code取字符串。此时报编译错误:“Constant expression required”。

枚举类

@Getter
@AllArgsConstructor
public enum AEnum {
    A("A", "Desc of A"),
    B("B", "Desc of B"),
    C("C", "Desc of C");
    
    private String code;
    private String desc;    

    // ...
}

switch...case...代码

// ...
String code = ...;
switch (code) {
    case MyEnum.A.getCode(): // 此处报"Constant expression required"
        // 处理逻辑
        break;
    default:
        // 处理逻辑
        break;
}
// ...

原因分析

case的条件值必须得是常量(表达式)且case后的条件值不能重复(相同),而此时枚举getCode()获取的不是常量,且不同的枚举可以有相同的code。

@Getter
@AllArgsConstructor
public enum AEnum {
    A("A", "Desc of A"),
    B("B", "Desc of B"),
    C("C", "Desc of C"),
    C2("C", "Desc of C");
    
    private String code;
    private String desc;    

    // ...
}

解决方法

其一,枚举的分支判断应用如下方式

// ...
MyEnum enum = ...;
switch (enum) {
    case A: 
        // 处理逻辑
        break;
    case C: 
        // 处理逻辑
        break;
    default:
        // 处理逻辑
        break;
}
// ...

其二,字段的分支判断要用常量

private final String aa = "aa";
private final String bb = "bb";
// ...
String code = ...;
switch (code) {
    case aa: 
        // 处理逻辑
        break;
    case bb: 
        // 处理逻辑
        break;
    case "dd": 
        // 处理逻辑
        break;
    default:
        // 处理逻辑
        break;
}
// ...

参考文章

你可能感兴趣的:(Java&JVM,java8,switch,case)