次のコードで列挙型が作成されます。
public enum Operation {
a('0'), b('1');
}
その後、バイト0または1があります。
ここで、バイトから適切な列挙型を取得するために、この列挙型に静的クラスが必要です。
public static Operation fromValue(byte value){ ...}
どうすればこれを行うことができますか?
aix が行っているようにスイッチをハードコーディングする代わりに、自動バリアントを使用して、すべてが同期していることを確認することもできます。を作成することでこれを最適化できることは明らかHashMap<Byte, Operation>
ですが(静的ブロックまたは単一のコンストラクターで初期化できます)、通常の列挙型の場合は次のようにする必要があります。
public static Operation fromValue(byte b) {
for (Operation op : values()) {
if (op.b == b) return op;
}
throw new IllegalArgumentException();
}
反対のマッピングを含む静的フィールドを列挙型に定義できます。
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
また、列挙型に要素を追加するたびに、その要素がマップに自動的に追加されます。
このようなもの?
public static Operation fromValue(byte value) {
switch (value) {
case 0: return Operation.a;
case 1: return Operation.b;
default: throw new IllegalArgumentException();
}
}