我遇到了这个问题,即在不知道实际所需的enum
类型的情况下,需要迭代其可能的值。
if (value instanceof Enum){
Enum enumValue = (Enum)value;
}
有什么办法可以从enumValue中提取其可能的值?
调用Class#getEnumConstants
方法获取枚举元素(如果不是枚举类则为null)。
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();
或者
YourEnumClass[] yourEnums = YourEnumClass.values();
Enum
)和类(Class
)一样具有类型。当前代码只是检查它是否为枚举类型,但没有指定其所属的枚举类型。
因为您没有指定枚举类型,所以必须使用反射来查找枚举值列表。
可以按以下方式实现:
enumValue.getDeclaringClass().getEnumConstants()
这将返回一个枚举对象数组,每个对象都是可用选项之一。
枚举的values()方法返回所有枚举实例。
public class EnumTest {
private enum Currency {
PENNY("1 rs"), NICKLE("5 rs"), DIME("10 rs"), QUARTER("25 rs");
private String value;
private Currency(String brand) {
this.value = brand;
}
@Override
public String toString() {
return value;
}
}
public static void main(String args[]) {
Currency[] currencies = Currency.values();
// enum name using name method
// enum to String using toString() method
for (Currency currency : currencies) {
System.out.printf("[ Currency : %s,
Value : %s ]%n",currency.name(),currency);
}
}
}
http://javaexplorer03.blogspot.in/2015/10/name-and-values-method-of-enum.html
我应该使用MyEnum.valueOf()还是MyEnum.values()?或者我漏掉了什么吗?
这里,Role是一个枚举类型,包含以下值[ADMIN, USER, OTHER]。
List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
System.out.println(role);
});
您也可以像这样使用java.util.EnumSet:
@Test
void test(){
Enum aEnum =DayOfWeek.MONDAY;
printAll(aEnum);
}
void printAll(Enum value){
Set allValues = EnumSet.allOf(value.getClass());
System.out.println(allValues);
}
Arrays.asList(YouEnumClass.values())
getClass()
方法可能返回枚举类型本身的子类型(如果枚举常量覆盖了枚举类型的方法),所以在这里你需要使用getDeclaringClass()
方法,它会返回声明该常量的枚举类型。 - ColinD