1. 概要

このチュートリアルでは、列挙型からランダムな値を生成する方法を学習します。

2. staticメソッドを使用したランダムなEnum

まず、特定の列挙型セットからランダムに生成された値を返すstatic関数を作成します。 列挙値は定数のセットを表します。 それでも、enumクラス本体内で静的メソッドを宣言することはできます。 静的メソッドをヘルパーとして使用して、ランダムな列挙値を生成します。

enum クラス本体内で、 static であり、enum値を返すメソッドを宣言します。 このメソッドは、 RandomオブジェクトからnextInt()を呼び出し、このメソッドに randomDirection()という名前を付けます。

public enum Direction {
    EAST, WEST, SOUTH, NORTH;
    
    private static final Random PRNG = new Random();

    public static Direction randomDirection()  {
        Direction[] directions = values();
        return directions[PRNG.nextInt(directions.length)];
    }
}

randomDirection()内で、整数引数を使用してメソッド nextInt()を呼び出します。 nextInt()メソッドは、方向配列にアクセスするためのランダムな数値を返します。 したがって、 bound 引数をnextInt()に渡して、整数が配列の範囲外にないことを確認する必要があります。 バインドされた引数は、方向の総数であり、配列のサイズを超えないことがわかっています。

さらに、 values()メソッドは、 randomDirection()メソッドが呼び出されるたびにenum値のコピーを作成します。 ランダムインデックスを生成した後にアクセスする最終メンバー変数リストを作成することで、パフォーマンスを向上させることができます。

private static final Direction[] directions = values();

これで、 randomDirection()メソッドは次のようになります。

public static Direction randomDirection() { 
    return directions[PRNG.nextInt(directions.length)]; 
}

最後に、次のメソッドを呼び出すことにより、ランダムなDirectionを生成できます。

Direction direction = Direction.randomDirection();

3. ジェネリックスを使用したランダムな列挙型

同様に、ジェネリックスを使用して、ランダムなenum値を生成できます。 ジェネリックスを使用して、任意のタイプの列挙型データを受け入れてランダムな値を生成するクラスを作成します:

public class RandomEnumGenerator<T extends Enum<T>> {
    private static final Random PRNG = new Random();
    private final T[] values;

    public RandomEnumGenerator(Class<T> e) {
        values = e.getEnumConstants();
    }

    public T randomEnum() {
        return values[PRNG.nextInt(values.length)];
    }
}

randomEnum()メソッドが前の例の randomDirection()メソッドにどのように似ているかに注目してください。 違いは、 RandomEnumGenerator クラスには、定数値を取得する列挙型を期待するコンストラクターがあることです。

次のように、RandomEnumGeneratorクラスを使用してランダムな方向を生成できます。

RandomEnumGenerator reg = new RandomEnumGenerator(Direction.class);
Direction direction = (Direction) reg.randomEnum();

ここでは、前のセクションのDirection列挙型クラスを使用しています。 RandomEnumGenerator はこのクラスを受け入れ、directionオブジェクトはDirectionクラスの定数値の1つを参照します。

4. 結論

このチュートリアルでは、列挙型からランダムな値を取得する方法を学びました。 これを行う2つの方法について説明しました。最初に、enumクラス内でstaticメソッドを使用します。これにより、enumクラスに厳密に制限されたランダム値が生成されます。メソッドが宣言されます。 さらに、定数値をキャッシュすることでパフォーマンスを向上させる方法を確認しました。 最後に、ランダムな値を取得するために、任意のタイプのenumを受け入れるクラスを使用してGenericsを利用します。

いつものように、この記事の完全なコードサンプルは、GitHubにあります。