我有一个具有不同值的Enum,并且想要切换一个字符串变量。现在,我碰壁试图将Enum值转换为Strings,可以用作大小写常量。
我最好的尝试是将Enum转换为String数组,但是该开关似乎不接受数组值作为大小写常量。 (IntelliJ说:“需要常量表达式”)
Enum myEnum = {FOO, BAR}
String input = "foo"
final String[] constant = Arrays.stream(myEnum.values()).map(Enum::name).toArray(String[]::new);
//converts Enum to String[]; made it final, so it is "constant"
switch (input) {
case constant[0]:
System.out.println("foo");
break;
case constant[1]:
System.out.println("bar");
break;
}
是否有一种优雅的方法可以使此开关依赖于枚举?
答案 0 :(得分:3)
您可以这样做:
public enum MyEnum {
FOO("foo"),
BAR("bar");
private String value;
public String getValue() {
return value;
}
public static MyEnum getState(String value) {
switch (value) {
case "foo":
return FOO;
case "bar":
return BAR;
}
return null;
}
private MyEnum(String value) {
this.value = value;
}
}
现在,在您的课堂上,您可以:
MyEnum myEnum = getState("foo"); // returns MyEnum.FOO
还要确保您处理getState()
返回null
时的情况
答案 1 :(得分:3)
您不应该转换它,因为它不是必需的。另外,由于case
是Java中的保留关键字,因此您的代码甚至无法编译。
您应该看看valueOf
的{{1}}方法。
您的代码如下所示:
Enum
这将返回public enum MyEnum {FOO, BAR}
//method
String input = "foo";
MyEnum niceFound = MyEnum.valueOf(input.toUpperCase());
,但是当给定值不作为类型出现时可以抛出FOO
。
答案 2 :(得分:1)
使用MyEnum.valueOf(value.toUpperCase())
public enum MyEnum {
FOO, BAR;
}
public static void process(String value) {
try {
switch (MyEnum.valueOf(value.toUpperCase())) {
case FOO :
System.out.println("FOO");
break;
case BAR :
System.out.println("BAR");
break;
default :
break;
}
}
catch (IllegalArgumentException e) {
// TODO: handle exception
}
public static void main(String[] a){
process("foo");
}
答案 3 :(得分:1)
使用Java 8+流的解决方案是在枚举内部创建一个方法:
public static Optional<MyEnum> getByValue(final String value) {
return Arrays.stream(MyEnum.values())
.filter(myEnum -> myEnum.value.equals(value))
.findFirst();
}
在您的String参数没有枚举值的情况下,此返回可选。但是您可以根据需要进行更改。