switch语句中的Java非恒定表达式
我有一个enum类,如下所示: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
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%的把握。我现在就去找重新加载它的代码。