Java에서 모든 열거 형 값을 얻는 방법은 무엇입니까?


95

enum가능한 값을 반복해야하는 실제 유형 을 알지 못한 채이 문제를 발견했습니다 .

if (value instanceof Enum){
   Enum enumValue = (Enum)value;
}

enumValue에서 가능한 값을 추출하는 방법에 대한 아이디어가 있습니까?

답변:


154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();

왜 getDeclaringClass ()를 사용합니까?
Peter Kriens

3
@PeterKriens : 개체 에서 유형 자체 의 하위 유형 을 반환 할 수 있기 때문 getClass()입니다 (예를 들어 상수가 유형 의 메서드를 재정의하는 경우). 여기서 원하는 상수를 선언 한 유형을 반환합니다 . enumenumenumenumgetDeclaringClass()enum
ColinD

감사! 나는 그 경우를 깨닫지 못했지만 당신이 옳습니다. 상수는 익명의 내부 클래스가 될 수 있습니다.
피터 크리 엔스 (Kriens)

97
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

또는

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();비 정적 메서드에서 호출하는 문제를 해결했습니다.
Jeremy

15

Enums는 같다 Class 입력된다는 점에서 es . 현재 코드는 어떤 유형의 Enum인지 지정하지 않고 Enum인지 확인합니다.

열거 형의 유형을 지정하지 않았기 때문에 열거 형 값 목록이 무엇인지 알아 내기 위해 리플렉션을 사용해야합니다.

다음과 같이 할 수 있습니다.

enumValue.getDeclaringClass().getEnumConstants() 

이것은 각각 사용 가능한 옵션 중 하나 인 Enum 개체의 배열을 반환합니다.


14

열거 형 값 방법

모든 enum 인스턴스를 반환하는 enum.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


7

... 또는 MyEnum.values ​​()? 아니면 내가 뭔가를 놓치고 있습니까?


2
예, 열거 형의 실제 클래스는 여기에서 정적 메서드 호출을 수행하는 데 사용할 수 없으며 일부 하위 유형의 Enum 인스턴스 일뿐입니다.
ColinD

3

여기서 Role은 [ADMIN, USER, OTHER] 값을 포함하는 열거 형입니다.

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });

그러나 이것은 일반적이지 않습니다. 질문은 Enum 개체 만있는 경우에 관한 것입니다. 따라서 EnumSet을 통해 클래스 선언 또는 더 나은 방법으로 이동해야합니다.
zeratul021

3

다음과 같이 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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.