使用下面的代码,我发现我在哪个数据中心并且工作正常..
public enum DatacenterEnum {
DEV, DC1, DC2, DC3;
private static DatacenterEnum compareLocation() {
String ourhost = getHostName();
for (DatacenterEnum dc : values()) {
String namepart = "." + dc.name().toLowerCase() + ".";
if (ourhost.indexOf(namepart) >= 0) {
return dc;
}
}
return null;// I don't want to do this now.
}
}
但它可能无法找到任何数据中心,所以目前我正在返回null
。
是否有任何直接方式或单行命令可以随机返回DC1
中的DC2
或DC3
或ENUM
,而不是返回{{1 }}?
我知道一种方法是创建一个字符串列表,然后随机选择0到2之间的任何整数,然后找到字符串。但它代码太多了,实际上它不是,只是试图看看有没有其他方法可以做到这一点?
我可以直接在ENUM中使用任何简单直接的方法吗?
答案 0 :(得分:3)
这是一行:
return DataCenterEnum.values()[new Random().nextInt(3) + 1)];
对于那些需要更严格控制代码的人来说,这是一个更安全的版本,它不依赖于枚举实例的顺序:
return new DataCenterEnum[]{DC1, DC2, DC3}[new Random().nextInt(3)];
答案 1 :(得分:1)
这是一个适用于任何枚举的通用解决方案。
单一排除的便捷方法:
public static <E extends Enum<E>> E getRandom(Class<E> aEnum, E exclude) {
return getRandom(aEnum, Collections.singletonList(exclude));
}
使用一个或多个排除项的通用方法:
public static <E extends Enum<E>> E getRandom(Class<E> aEnum, List<E> exclude){
//Convert set of enums into a list
List<E> enums = new ArrayList<E>(EnumSet.allOf(aEnum));
//Remove items from the list that you want to exclude
enums.removeAll(exclude);
int size = enums.size();
if(size != 0){
//Get random enum
int randomIndex = new Random().nextInt(size);
return enums.get(randomIndex);
} else {
throw new IllegalArgumentException("Empty Enumeration after excludes");
}
}
您可以致电
EnumUtil.getRandom(DatacenterEnum.class, DatacenterEnum.DEV);
答案 2 :(得分:0)
您可以使用values()方法,该方法返回一个数组。然后使用Math.random()返回一个随机实例。
Here就是一个例子:
public static void main (String[] args) {
String[] arr = {"DEV","DC1","DC2","DC3"}; //returned by Enum.values(), you get the idea
String randElement = arr[(int) ((Math.random() * 3) +1)];
System.out.println(randElement);
}
基本上它归结为生成1到n之间的随机数:)