从单个字符解码Java枚举

时间:2019-05-07 09:20:16

标签: java

我有

  

java.lang.Enum.valueOf(Enum.java:238)没有枚举常量[...]

当我尝试将单个char字符串解码为枚举时。

出什么问题了,我该如何解决?

public class testEnum {

    public enum Colors {
        RED("R"), GREEN("G"), BLUE("B");
        private final String code;

        Colors(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }

    }

    public static void main(String args[]) throws Exception {
        Colors c = Colors.valueOf("R");
        System.out.println(c);
    }
}

在这种情况下,我希望RED进入输出控制台。

4 个答案:

答案 0 :(得分:3)

Colors.valueOf("R")是一个隐式声明的方法,是Enum.valueOf(Colors.class, "R")的快捷方式。

The documentation of Enum.valueOf状态

  

@param name要返回的常量的名称

您的常量为REDGREENBLUE

You may wanna get an enum instance by its field.

答案 1 :(得分:1)

  

出什么问题了,我该如何解决?

Java无法知道您正在尝试传递code字段的值来进行查找。

要解决此问题,请指定完整名称:

Colors.valueOf("RED")

或构造一个Map<String, Colors>,您可以从中查找实例。

Map<String, Colors> map = new HashMap<>();
for (Colors colors : Colors.values()) {
  map.put(colors.code, colors);
}
// Assign to a field somewhere.

// Then, later:
Colors c = map.get("R");

答案 2 :(得分:1)

从您调用的方法的文档中:

valueOf:
Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)
Returns:
the enum constant with the specified name

在您的情况下,枚举“名称”将为“红色”,“绿色”或“蓝色”。或者如果您要引用枚举,则为Colors.RED.name()

如果要查找与代码相对应的Colors枚举,您可以做的就是这样:

public class Sampler {
    public enum Colors {
        RED("R"), BLUE("B"), GREEN("G");

        private static final Map<String, Colors> COLORS_MAP;

        static {
            COLORS_MAP = new HashMap<>();
            for(Colors color : values()) {
                COLORS_MAP.put(color.code, color);
            }
        }

        private final String code;

        Colors(String code) {
            this.code = code;
        }

        public String getCode() {
            return code;
        }

        public static Colors fromCode(String code) {
            return COLORS_MAP.get(code);
        }
    }

    public static void main(String[] args) {
        Colors c = Colors.fromCode("R");
        System.out.println(c);
    }
}

答案 3 :(得分:0)

我的决定

public enum Colors {
    RED("R"), GREEN("G"), BLUE("B");
    private final String code;

    Colors(String code) {
        this.code = code;
    }

    public String getCode() {
        return code;
    }

    public static Colors ofCode(String code){
        Colors[] values = Colors.values();
        for (Colors value : values) {
            if(value.code.equals(code)){
                return value;
            }

        }
        throw new IllegalArgumentException("Code not found"); 
    }

}