2009-10-26 2 views
49

나는 열거 형 (나는 Class<? extends Enum>이있다)을위한 클래스 객체를 가지고 있으며,이 열거 형에 의해 표현 된 열거 형 값들의 목록을 얻을 필요가있다. values 정적 함수에는 필요한 것이 있지만 클래스 객체에서이 함수에 액세스하는 방법을 모르겠습니다.Java Enums : 클래스에서 열거 된 값을 나열합니다. extends Enum>

+0

정적 - 반사. – IAdapter

+0

'Class'는 반사 객체입니다 (패키지보다 선행합니다). –

답변

10

Class#getEnumConstants() 전화로은 간단 반사를 사용하여 :

List<Enum> enum2list(Class<? extends Enum> cls) { 
    return Arrays.asList(cls.getEnumConstants()); 
} 
16

당신이 필요로하는 값의 이름을 알고있는 경우 : 당신이하지 않으면

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

을, 다음과 같이 배열을 얻을 수 있습니다 (톰이 먼저 얻었을 때) :

,515,
 klass.getEnumConstants(); 
3

제가 EnumSet#allOf() 언급되지 있는지 놀라게하고 :

public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType)

지정된 요소 타입의 모든 요소를 ​​포함한 ENUM 세트를 생성한다.

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