4

可能重复:
在开关/案例中使用枚举

给定枚举

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

为什么是这样?据我了解,分配给 id in 的数值ExitCodes是 Constant ( final)

请问这个怎么改?

4

3 回答 3

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:
    ...
于 2013-01-07T20:20:38.857 回答
1

您需要创建一个退出代码映射来ExitCode枚举值。然后你可以做

switch(ExitCode.lookup(exitCode)) {
    case PROGRAM_FINSHED_SUCCESSFULLY:
于 2013-01-07T20:04:48.600 回答
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
于 2013-01-07T20:05:09.310 回答