Jak uzyskać wszystkie wartości wyliczenia w Javie?

96

Natknąłem się na ten problem, że nie znając rzeczywistego enumtypu, potrzebuję iteracji jego możliwych wartości.

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

Jakieś pomysły, jak wyodrębnić z enumValue jego możliwe wartości?

rzymski
źródło

Odpowiedzi:

154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
ColinD
źródło
Dlaczego używasz metody getDeclaringClass ()?
Peter Kriens
3
@PeterKriens: Ze względu getClass()na enumprzedmiot może zwrócić podtyp tego enumsamego typu (w przypadku, powiedzmy, enumstały zastępuje sposób od enumrodzaju). getDeclaringClass()zwraca enumtyp, który zadeklarował tę stałą, co jest tym, czego chcesz tutaj.
ColinD,
Dzięki! Nie zdawałem sobie sprawy z tego przypadku, ale masz rację, stała może należeć do anonimowej klasy wewnętrznej.
Peter Kriens
101
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

Lub

YourEnumClass[] yourEnums = YourEnumClass.values();
ktoś
źródło
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();rozwiązałem mój problem z wywoływaniem z metody niestatycznej.
Jeremy
15

Enums są podobne do Classes, ponieważ są wpisywane. Twój aktualny kod po prostu sprawdza, czy jest to Enum, bez określania, jakiego typu Enum jest częścią.

Ponieważ nie określiłeś typu wyliczenia, będziesz musiał użyć odbicia, aby dowiedzieć się, jaka jest lista wartości wyliczenia.

Możesz to zrobić tak:

enumValue.getDeclaringClass().getEnumConstants() 

To zwróci tablicę obiektów Enum, z których każdy jest jedną z dostępnych opcji.

RodeoClown
źródło
14

wartości metoda wyliczenia

enum.values ​​(), która zwraca wszystkie wystąpienia wyliczenia.

  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

Rajesh Dixit
źródło
7

... lub MyEnum.values ​​()? A może coś mi brakuje?

usunięte
źródło
2
Tak, rzeczywista klasa wyliczenia nie jest tutaj dostępna, aby wywołać metodę statyczną, tylko wystąpienie jakiegoś podtypu Enum.
ColinD
4

W tym przypadku rola to wyliczenie zawierające następujące wartości [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });
Ashwani Sharma
źródło
Jednak to nie jest ogólne. Pytanie dotyczy przypadku, gdy mamy tylko obiekt Enum. Musisz więc przejść przez deklarowanie klasy lub lepiej, za pośrednictwem EnumSet.
zeratul021
3

Można również w ten sposób użyć 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);
}
David Lilljegren
źródło