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に割り当てられた数値ExitCodesは定数です(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

私の職場でも似たようなパターンがあります。

enum クラスを変更して、逆引き参照マップを追加します。

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 に答える