Java利用枚举生成随机值

425 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

在工作中有些需求需要我们根据一些数据随机随机选择,下面我们看看如何利用枚举来实现。

使用静态方法的随机枚举值

首先我们创建一个静态函数,该函数从特定枚举集中返回一个随机生成的值。

枚举值表示一组常量;当然我们仍然可以在枚举类主体中声明静态方法。使用静态方法作为帮助器来生成随机枚举值。

在枚举类体内声明了一个静态方法并返回一个枚举值。此方法将从 Random 对象调用 nextInt(),我们将此方法命名为 getRandom():

public enum RandomEnum {
    ONE, TWO, THREE, FOUR, FIVE;

    private static final Random random = new Random();

    public static RandomEnum getRandom()  {
        RandomEnum[] enums = values();
        return enums[random.nextInt(enums.length)];
    }
}

在 getRandom() 中,我们使用整数参数调用方法 nextInt()。 nextInt() 方法返回一个随机数来访问数组;所以我们需要将绑定参数长度传递给 nextInt() 来确保整数不会因为长度问题导致数组越界。

而且因为每次调用 getRandom() 方法时,values() 方法都会创建枚举值的副本,所以我们可以通过创建最终成员变量列表来提高性能,我们在生成随机索引后访问该列表:

    private static final RandomEnum[] enums = values();
    public static RandomEnum getRandom()  {
        return enums[random.nextInt(enums.length)];
    }

我们可以通过调用getRandom()方法生成一个随机枚举值:

RandomEnum randomEnum = RandomEnum.getRandom();

带有泛型的随机枚举值

我们也可以使用泛型来生成随机枚举值,通过泛型创建可以接受任何类型的枚举数据来生产随机值:

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

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

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

randomEnum() 方法与前面示例中的 getRandom() 不同在于 RandomGenerator 类具有一个构造函数,该构造函数期望从中获取常量值的枚举类型。

我们可以使用 RandomGenerator 类生成随机方向,如下所示:

RandomGenerator reg = new RandomGenerator(RandomEnum.class);
RandomEnum randomEnum = (RandomEnum) reg.randomEnum();

RandomGenerator 接受此类,方向对象将引用 RandomEnum类中的常量值之一。

\

以上是两种方法来做到从枚举中获取随机值:在枚举类中使用静态方法生成一个随机值,严格限制在声明该方法的枚举类中。此外,了解了如何通过缓存常量值来提高性能。最后我们通过使用一个接受任何类型枚举的类来利用泛型,以获得随机值。