26

++列挙型の演算子を実装することは可能ですか?

列挙型を使用してステート マシンの現在の状態を処理しますが、++演算子を使用できると便利です。

4

2 に答える 2

57

列挙型を「インクリメント」することはできませんが、次の列挙型を取得できます。

// MyEnum e;
MyEnum next = MyEnum.values()[e.ordinal() + 1];

ただし、列挙型にインスタンス メソッドを作成する方がよいでしょう。

「次の」インスタンスがない最後の列挙型インスタンスで、問題のある次の値がどのように処理されるかに注意してください。

public enum MyEnum {

    Alpha,
    Bravo,
    Charlie {
        @Override
        public MyEnum next() {
            return null; // see below for options for this line
        };
    };

    public MyEnum next() {
        // No bounds checking required here, because the last instance overrides
        return values()[ordinal() + 1];
    }
}

だからあなたはこれを行うことができます:

// MyEnum e;
e = e.next();

next()オーバーライドされたメソッドの実装には、次のような適切な選択肢があります。

  • return null; // there is no "next"
  • return this; // capped at the last instance
  • return values()[0]; // rollover to the first
  • throw new RuntimeException(); // or a subclass like NoSuchElementException

メソッドをオーバーライドするとvalues()、長さをチェックするために配列を生成する潜在的なコストを回避できます。たとえばnext()、最後のインスタンスがそれをオーバーライドしない場合の実装は次のようになります。

public MyEnum next() {
    if (ordinal() == values().length - 1)
        throw new NoSuchElementException();
    return values()[ordinal() + 1];
}

ここでは、ordinal()との両方values()が (通常) 呼び出され、上記のオーバーライドされたバージョンよりも実行コストが高くなります。

于 2013-07-15T21:48:29.537 に答える