我有一个包含DOT_BLUE,DOT_YELLOW,SQUARE_BLUE,SQUARE_YELLOW等元素的枚举。我也有一个字符串,比如String string =“DOT_BLUE”。现在我想根据字符串的内容访问枚举。我懒得写所有if else语句(还有更多的元素)并且在Java中使用反射是棘手的,因为我想在android上运行这段代码。
根据字符串的不同,还有其他更优雅的方式来访问我的枚举吗?我不知道,但我不是Java专家。所以我很高兴得到一个明确的答案,即使它是“不”。
答案 0 :(得分:1)
枚举在java 6中有一个方法valueOf(String name)可以帮助你。
JavaDoc说
“返回具有指定名称的指定枚举类型的枚举常量。该名称必须与用于声明此类型中的枚举常量的标识符完全匹配。”
参考:Class Enum
public enum Color {
DOT_BLUE, DOT_YELLOW, SQUARE_BLUE, SQUARE_YELLOW;
public static void main(String[] args) {
Color color = Color.valueOf("DOT_BLUE");
System.out.println(color.equals(Color.DOT_BLUE));
System.out.println(color);
}
}
答案 1 :(得分:-1)
Jon Skeet建议你可以使用MyEnum.valueOf(name)。另一种选择是为每个枚举存储一个值:
public enum MyEnum {
DOT_BLUE ("blue"),
DOT_RED ("red");
private String name;
MyEnum(String name) {
this.name = name;
}
// provide a method to get the MyEnum based on some input
public static MyEnum getByName(String name) {
for (MyEnum myEnum : values()) {
if (myEnum.getName().equals(name)) {
return myEnum;
}
throw new IllegalArgumentException("No enum with the provided parameter");
}
}
}
当您拥有更多属性并希望根据所有属性/其中一些来查找枚举时,此选项更有用/更强大。
答案 2 :(得分:-1)
你可以实现类似的东西。
enum Pattern {
DOT_BLUE, DOT_YELLOW, SQUARE_BLUE, SQUARE_YELLOW;
Pattern fromString(String code) {
for(Pattern p : values()) {
if(p.toString().equals(code)) return p
}
return null;
}
}
如果您实现NULL_PATTERN并返回它,可能会更好。此外,如果有许多值,您可以通过创建内部Map并执行查找来缩短搜索时间。