用字符串调用枚举类型



我有一个枚举,其中包含诸如dot_blue,dot_yellow,square_blue,square_yellow等元素。我也有一个字符串,例如字符串string =" dot_blue"。现在,我想根据字符串是什么来访问枚举。我懒得写所有否则语句(还有更多元素),并且在Java中使用反射很棘手,因为我想在Android Aswell上运行此代码。

那么,是否有其他更优雅的方式可以根据字符串是什么来访问我的枚举?我不知道,但我不是爪哇专家。因此,即使是"不",我也会为一个明确的答案感到高兴。

枚举在java 6中具有一个方法值(字符串名称),可以帮助您。

javadoc说

"用指定名称返回指定的枚举类型的枚举常数。该名称必须完全匹配用于声明此类枚举常数的标识符。"

参考:类枚举

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);
    }
}

您可以实现类似的东西。

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并改为返回它,也许更好。另外,如果有很多值,您可以通过创建内部地图并进行查找来缩短搜索时间。

作为乔恩·斯基特(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");
        } 
    }
}

当您拥有更多属性并希望根据所有枚举/其中的某些枚举找到一个枚举时,此选项更有用/功能。

最新更新