1. 概要

このチュートリアルでは、intをJavaのenum値にキャストするさまざまな方法を簡単に見ていきます。 キャストする直接的な方法はありませんが、それを概算する方法はいくつかあります。

2. 列挙型の使用

まず、列挙型の値メソッドを使用してこの問題を解決する方法を見てみましょう。

ピザの注文のステータスを定義する列挙型PizzaStatusを作成することから始めましょう。

public enum PizzaStatus {
    ORDERED(5),
    READY(2),
    DELIVERED(0);

    private int timeToDelivery;

    PizzaStatus (int timeToDelivery) {
        this.timeToDelivery = timeToDelivery;
    }

    // Method that gets the timeToDelivery variable.
}

各定数列挙値をtimeToDeliveryフィールドに関連付けます。 定数enumを定義するとき、timeToDeliveryフィールドをコンストラクターに渡します。

static valuesメソッドは、宣言の順序で列挙型のすべての値を含む配列を返します。したがって、 timeToDelivery 整数値を使用して、対応する列挙型値を取得できます。

int timeToDeliveryForOrderedPizzaStatus = 5;

PizzaStatus pizzaOrderedStatus = null;

for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
    if (pizzaStatus.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus) {
        pizzaOrderedStatus = pizzaStatus;
    }
}

assertThat(pizzaOrderedStatus).isEqualTo(PizzaStatus.ORDERED);

ここでは、 PizzaStatus.values()によって返される配列を使用して、timeToDeliveryプロパティに基づいて一致する値を見つけます。

ただし、このアプローチは非常に冗長です。 さらに、対応するPizzaStatusをフェッチするたびに、PizzaStatus.values()を反復処理する必要があるため、非効率的です。

2.1. Java8ストリームを使用

Java 8アプローチを使用して、一致するPizzaStatusを見つける方法を見てみましょう。

int timeToDeliveryForOrderedPizzaStatus = 5;

Optional<PizzaStatus> pizzaStatus = Arrays.stream(PizzaStatus.values())
  .filter(p -> p.getTimeToDelivery() == timeToDeliveryForOrderedPizzaStatus)
  .findFirst();

assertThat(pizzaStatus).hasValue(PizzaStatus.ORDERED);

このコードは、forループを使用するコードよりも簡潔に見えます。 ただし、それでも、一致する列挙型を取得する必要があるたびに、 PizzaStatus.values()を繰り返し処理します。

また、このアプローチでは、 オプション PizzaStatusインスタンスの代わりに直接

3. マップを使用する

次に、Javaの Mapデータ構造とvalues メソッドを使用して、整数値を配信する時間に対応する列挙値をフェッチします。

このアプローチでは、mapsの初期化中にvaluesメソッドが1回だけ呼び出されます。 さらに、マップを使用しているため、配信する時間に対応する列挙値をフェッチする必要があるたびに、値を繰り返す必要はありません。

内部で静的マップtimeToDeliveryToEnumValuesMappingを使用します。これは、対応する列挙値に配信する時間のマッピングを処理します。

さらに、Enumクラスのvaluesメソッドは、すべての列挙値を提供します。 静的ブロックでは、列挙値の配列を反復処理し、対応する時間とともにそれらをマップに追加して、キーとして整数値を提供します:

private static Map<Integer, PizzaStatus> timeToDeliveryToEnumValuesMapping = new HashMap<>();

static {
    for (PizzaStatus pizzaStatus : PizzaStatus.values()) {
        timeToDeliveryToEnumValuesMapping.put(
          pizzaStatus.getTimeToDelivery(),
          pizzaStatus
        );
    }
}

最後に、timeToDelivery整数をパラメーターとして受け取るstaticメソッドを作成します。 このメソッドは、静的マップtimeToDeliveryToEnumValuesMappingを使用して対応する列挙値を返します。

public static PizzaStatus castIntToEnum(int timeToDelivery) {
    return timeToDeliveryToEnumValuesMapping.get(timeToDelivery);
}

静的マップと静的メソッドを使用して、整数値を配信する時間に対応する列挙値をフェッチします。

4. 結論

結論として、整数値に対応する列挙値をフェッチするためのいくつかの回避策を検討しました。

いつものように、これらのコードサンプルはすべてGitHub利用できます。