93

以前は、LegNo 列挙型を単純に次のように定義していました。

NO_LEG, LEG_ONE, LEG_TWO

を呼び出すことreturn LegNo.values()[i];で、各列挙型に関連付けられた値を取得できました。

しかし、今はLegNoenumNO_LEGを 0 ではなく int -1 にすることに決めたので、プライベート コンストラクターを使用してその int 値を初期化および設定することにしました

NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

private LegNo(final int leg) { legNo = leg; }

唯一のことは、私がこのようにしているため、列挙型values()に対してメソッドが機能しないということです。NO_LEGint に関連付けられた列挙型を取得するにはどうすればよいですか? case switch ステートメントまたは if-elseif-elseif を使用する以外に、これを行う効率的な方法はありますか

列挙型から int 値を取得することに関連する多くの SO の質問を見ることができますが、私はその逆です。

4

8 に答える 8

154

2018年8月編集

今日はこれを次のように実装します

public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private final int value;

    LegNo(int value) {
        this.value = value;
    }

    public static Optional<LegNo> valueOf(int value) {
        return Arrays.stream(values())
            .filter(legNo -> legNo.value == value)
            .findFirst();
    }
}

列挙型内のマッピングを維持する必要があります。

public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private int legNo;

    private static Map<Integer, LegNo> map = new HashMap<Integer, LegNo>();

    static {
        for (LegNo legEnum : LegNo.values()) {
            map.put(legEnum.legNo, legEnum);
        }
    }

    private LegNo(final int leg) { legNo = leg; }

    public static LegNo valueOf(int legNo) {
        return map.get(legNo);
    }
}

静的ブロックは1回だけ呼び出されるため、ここでは実質的にパフォーマンスの問題はありません。

valueOf編集:他のJavaクラスとよりインラインであるため、メソッドの名前を変更しました。

于 2012-06-15T09:15:18.633 に答える
24

すべてのメンバーを反復処理して正しいメンバーを返す静的メソッドを列挙型に含めることもできます。

public enum LegNo {
   NO_LEG(-1),
   LEG_ONE(1),
   LEG_TWO(2);

   private int legIndex;

   private LegNo(int legIndex) { this.legIndex = legIndex; }

   public static LegNo getLeg(int legIndex) {
      for (LegNo l : LegNo.values()) {
          if (l.legIndex == legIndex) return l;
      }
      throw new IllegalArgumentException("Leg not found. Amputated?");
   }
}

ここで、整数でEnum値を取得する場合は、次を使用します。

int myLegIndex = 1; //expected : LEG_ONE
LegNo myLeg = LegNo.getLeg(myLegIndex);
于 2012-06-15T10:02:45.477 に答える
12

また、enum LegNo で values() メソッドを呼び出すだけで、特定の整数値に対応する Enum 値にアクセスすることもできます。LegNo 列挙型のフィールドを返します。 LegNo.values()[0]; //returns LEG_NO LegNo.values()[1]; //returns LEG_ONE LegNo.values()[2]; //returns LEG_TWO

正確には彼が探していたものではありませんでしたが、かなり似ていましたが、非常に単純でした。(対象は死んでいますが、他の誰かにとっては役に立つかもしれません。)

于 2016-03-18T15:36:04.880 に答える
1
public enum LegNo {
    NO_LEG(-1), LEG_ONE(1), LEG_TWO(2);

    private int legNo;

    private LegNo(int leg) { legNo = leg; }

    public static LegNo valueOf(int legNo) {
        for (LegNo leg : LegNo.values()) {
            if (leg.legNo == legNo) return leg;
        }   
    }
}

assert LegNo.valueOf(2) == LegNo.LEG_TWO
assert LegNo.valueOf(3) == null
于 2013-11-16T04:07:53.100 に答える
1

列挙型には3つの要素しか含まれていないため、if else提案したように、一連の を使用するのが最も速い方法です。

編集: adarshr が提供した回答は、多くの列挙値がある一般的なケースにより適していますが、それはあなたの問題にはやり過ぎだと思います。

于 2012-06-15T09:21:31.587 に答える