Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
switch语句中的Java非恒定表达式_Java_Enums - Fatal编程技术网

switch语句中的Java非恒定表达式

switch语句中的Java非恒定表达式,java,enums,Java,Enums,我有一个enum类,如下所示: 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 (myString) { case MyEnum.VALUE1

我有一个enum类,如下所示:

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 (myString) {
case MyEnum.VALUE1.getId():
   ...
}
我想要一个关于枚举值的switch语句。如下所示:

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 (myString) {
case MyEnum.VALUE1.getId():
   ...
}
我得到以下编译时错误:case表达式必须是常量表达式


有没有办法让它与enum和switch语句一起工作?我之所以向枚举中添加值,是因为我需要一些带有“.”和其他不允许的字符的id。

换一种方式:不要在case语句中查找每个枚举的id,而是在switch语句中查找id的枚举

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

有几种方法可以编写getEnumById方法。有几个选项。

添加一个静态方法,该方法接受
字符串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;
        }
    }
}

所以有些枚举具有相同的ID?不,您可以直接使用枚举值(
VALUE1
),或者使用字符串(“value.1”-需要Java 7),或者不使用
开关(
如果(…getId.equals(…))
是否确实要在给定id的情况下查找枚举实例?您需要获取字符串的枚举,然后将其打开。不能有非常量大小写。@BrianRoach谢谢,这正是我要查找的。您的枚举有一个main方法吗?行得通吗?我从未尝试过。存储
值()
在它自己的字段中。这将提高效率。是的,枚举具有几乎所有类的相同功能,我将main方法作为测试包括在内。@Obicere只是想知道,但是,你不认为枚举是在幕后进行的吗?@KevinBowersox一点也不。它必须在每次调用时重新加载枚举,否则可以进行修改。这是一个错误rd语句,但我对此有100%的把握。我现在就去找重新加载它的代码。