switch语句中的Java非常量表达式

时间:2014-02-12 01:42:37

标签: java enums

我有一个类似于以下内容的枚举类:

public enum MyEnum {
    VALUE1("value.1"),
    VALUE2("value.2");

    private String value;
    private MyEnum(String value) { this.value = value; }

    public String getId() { return id; }
}

我想对枚举的值有一个switch语句。如下所示:

switch (myString) {
case MyEnum.VALUE1.getId():
   ...
}

我得到以下编译时错误:case表达式必须是常量表达式。

有没有办法让它与enum和switch语句一起使用?我在枚举中添加值的原因是因为我想要一些带有“。”的ID。和其他不允许的字符。

2 个答案:

答案 0 :(得分:6)

添加一个静态方法,接受String id作为参数并返回相应的MyEnum

public enum MyEnum {
    VALUE1("value.1"),
    VALUE2("value.2");

    private String id;

    private MyEnum(String value) {
        this.id = value;
    }

    public String getId() {
        return id;
    }

    public static MyEnum fromId(String id){
        for(MyEnum e:MyEnum.values()){
            if(e.getId().equals(id)){
                return e;
            }
        }
        throw new RuntimeException("Enum not found");
    }

    public static void main(String[] args) {
        String value = "value.2";
        switch(MyEnum.fromId(value)){
        case VALUE1:
            System.out.println("ID 1");
        break;
        case VALUE2:
            System.out.println("ID 2");
            break;
        }
    }
}

答案 1 :(得分:0)

走另一条路:不要在case语句中查找每个枚举的id,而是在switch语句中查找id的enum。

switch (MyEnum.getEnumById(myString)) {
case VALUE1:
  //  ./..
  break;
case VALUE2:
  //  ./..
  break;
case VALUE3:
  //  ./..
  break;
}

有几种方法可以编写getEnumById方法。 This question有几个选择。