Java枚举:列出Class <?中的枚举值 扩展枚举>


76

我有一个枚举的类对象(我有一个Class<? extends Enum>),我需要获取此枚举表示的枚举值的列表。该values静态函数有我需要什么,但我不知道怎么去从类对象访问它。


它的静态-反射。
IAdapter

Class是一个反射对象(它早于包)。
Tom Hawtin-大头钉

Answers:



20

如果您知道值的名称,则需要:

     Class<? extends Enum> klass = ... 
     Enum<?> x = Enum.valueOf(klass, "NAME");

如果您不这样做,则可以通过(如汤姆首先介绍的那样)获得它们的数组:

     klass.getEnumConstants();


7

令我惊讶的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);

当然,这返回a Set,而不是a 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

看来此方法将会更快。反射方法克隆使用反射和安全性API构建的共享数组。在EnumSet使用存储在一个“位向量” long
杰夫·沃克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.