打开自定义枚举值的值

时间:2013-01-07 19:57:49

标签: java enums

  

可能重复:
  using enum in switch/case

给定枚举

public enum ExitCodes {

    DESPITE_MULTIPLE_ATTEMPTS_CONNECTION_TO_SERVER_FAILED(-1),
    PROGRAM_FINISHED_SUCCESSFULLY(0),
    // ... more stuff

    private final int id;

    ExitCodes(final int id) {
        this.id = id;
    }

    public int getValue() {
        return id;
    }
}

作为另一个班级的一部分,我想

switch (exitCode) {
    case ExitCodes.PROGRAM_FINISHED_SUCCESSFULLY.getValue():
       // do stuff

Constant expression required

失败

这是为什么?据我了解,ExitCodes中分配给id的数值是常量(final

请问如何纠正?

3 个答案:

答案 0 :(得分:2)

非映射方法是在ExitCodes中“遍历”枚举条目:

public static ExitCodes getByID(int id) {
   for (final ExitCodes element : EnumSet.allOf(ExitCodes.class)) {
    if (element.id == id) {
      return element;
    }
   }

   throw new IllegalArgumentException("Can't find " + id);
}

然后查找你可以做:

switch (ExitCodes.getByID(exitCode)) {
    case PROGRAM_FINSHED_SUCCESSFULLY:
    ...

答案 1 :(得分:1)

您需要创建一个退出代码映射到ExitCode枚举值。然后就可以了

switch(ExitCode.lookup(exitCode)) {
    case PROGRAM_FINSHED_SUCCESSFULLY:

答案 2 :(得分:1)

我的工作也有类似的模式。

更改您的枚举类以添加反向查找地图:

public enum ExitCodes {

    // All the same until here
    private static HashMap<Integer, ExitCodes> valueToExitCodeMap = null;

    public static ExitCodes getEnumByValue(int value)
    {
        if(valueToExitCodeMap == null)
        {
            valueToExitCodeMap = new HashMap<Integer, ExitCodes>();
            for(ExitCodes code : values())
            {
                valueToExitCodeMap.put(new Integer(code.id), code);
            }
        }
        return valueToExitCodeMap.get(new Integer(value));
    }
}

然后改变这个:

switch (ExitCodes.getEnumByValue(exitCode)) {
case PROGRAM_FINISHED_SUCCESSFULLY:
   // do stuff