1

次のコードで列挙型が作成されます。

public enum Operation {
    a('0'), b('1');
}

その後、バイト0または1があります。

ここで、バイトから適切な列挙型を取得するために、この列挙型に静的クラスが必要です。

    public static Operation fromValue(byte value){ ...}

どうすればこれを行うことができますか?

4

3 に答える 3

3

aix が行っているようにスイッチをハードコーディングする代わりに、自動バリアントを使用して、すべてが同期していることを確認することもできます。を作成することでこれを最適化できることは明らかHashMap<Byte, Operation>ですが(静的ブロックまたは単一のコンストラクターで初期化できます)、通常の列挙型の場合は次のようにする必要があります。

public static Operation fromValue(byte b) {
    for (Operation op : values()) {
        if (op.b == b) return op;
    }
    throw new IllegalArgumentException();
}
于 2012-05-25T10:36:12.613 に答える
2

反対のマッピングを含む静的フィールドを列挙型に定義できます。

static Hashtable<byte, Operation> byteToOperation = new Hashtable<byte, Operation>();

そして、列挙型のコンストラクターを変更して実行しますbyteToOperation.put(byteValue, this)

次に、列挙型に静的関数を作成して、このマップから操作を取得します。

public static Operation fromValue(byte value) {
    return byteToOperation.get(value);
}

そのように:

Operation.fromValue('0'); //returns Operation.a
Operation.fromValue('1'); //returns Operation.b

また、列挙型に要素を追加するたびに、その要素がマップに自動的に追加されます。

于 2012-05-25T10:40:07.760 に答える
2

このようなもの?

public static Operation fromValue(byte value) {
  switch (value) {
  case 0:  return Operation.a;
  case 1:  return Operation.b;
  default: throw new IllegalArgumentException();
  }
}
于 2012-05-25T10:27:57.063 に答える