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のにあります。