一起养成写作习惯!这是我参与「掘金日新计划 · 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类中的常量值之一。
\
以上是两种方法来做到从枚举中获取随机值:在枚举类中使用静态方法生成一个随机值,严格限制在声明该方法的枚举类中。此外,了解了如何通过缓存常量值来提高性能。最后我们通过使用一个接受任何类型枚举的类来利用泛型,以获得随机值。