我有一个枚举类的类对象(我有一个 Class<? extends Enum>
),需要获取该枚举类代表的所有枚举值的列表。静态函数 values
包含我需要的信息,但我不确定如何从类对象中访问它。
如果您知道所需值的名称:
Class<? extends Enum> klass = ...
Enum<?> x = Enum.valueOf(klass, "NAME");
如果没有,你可以通过以下方式获取它们的数组(就像Tom首先做的那样):
klass.getEnumConstants();
EnumSet#allOf()
没有被提及:
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)
创建一个包含指定元素类型中的所有元素的枚举集。
考虑以下enum
:
enum MyEnum {
TEST1, TEST2
}
只需如下调用方法:
Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class);
Set
而不是List
,但在许多(大多数?)情况下应该足够了。enum
:Class<? extends Enum> enumClass = MyEnum.class;
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass);
Class#getEnumConstants()
相比,此方法的优点在于它是类型化的,因此除了 enum
之外的任何内容都无法传递给它。例如,下面的代码是有效的并返回 null
:String.class.getEnumConstants();
虽然这段代码无法编译:
EnumSet.allOf(String.class); // won't compile
EnumSet
使用存储在long
中的“位向量”。 - Jeff Walker使用反射和调用Class#getEnumConstants()一样简单:
List<Enum<?>> enum2list(Class<? extends Enum<?>> cls) {
return Arrays.asList(cls.getEnumConstants());
}