Bagaimana cara mendapatkan semua nilai enum di Java?

95

Saya menemukan masalah ini sehingga saya tanpa mengetahui enumtipe sebenarnya yang saya butuhkan untuk mengulangi kemungkinan nilainya.

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

Ada ide bagaimana mengekstrak dari enumValue kemungkinan nilainya?

Roma
sumber

Jawaban:

154
Object[] possibleValues = enumValue.getDeclaringClass().getEnumConstants();
ColinD
sumber
Mengapa Anda menggunakan getDeclaringClass ()?
Peter Kriens
3
@PeterKriens: Karena getClass()suatu enumobjek dapat mengembalikan subtipe dari enumtipe itu sendiri (jika, katakanlah, enumkonstanta menimpa metode dari enumtipe). getDeclaringClass()mengembalikan enumtipe yang menyatakan konstanta itu, yang Anda inginkan di sini.
ColinD
Terima kasih! Saya tidak menyadari kasus itu tetapi Anda benar, konstanta dapat menjadi kelas dalam anonim.
Peter Kriens
97
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();

Atau

YourEnumClass[] yourEnums = YourEnumClass.values();
some one
sumber
YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();memecahkan masalah saya menelepon dari metode non-statis.
Jeremy
15

Enums sama seperti Classes yang diketik. Kode Anda saat ini hanya memeriksa apakah itu adalah Enum tanpa menentukan jenis Enum itu.

Karena Anda belum menentukan jenis enum, Anda harus menggunakan refleksi untuk mencari tahu apa daftar nilai enum itu.

Anda bisa melakukannya seperti ini:

enumValue.getDeclaringClass().getEnumConstants() 

Ini akan mengembalikan larik objek Enum, dengan masing-masing menjadi salah satu opsi yang tersedia.

RodeoClown
sumber
14

nilai metode enum

enum.values ​​() yang mengembalikan semua instance enum.

  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
sumber
7

... atau MyEnum.values ​​()? Atau apakah saya melewatkan sesuatu?

dihapus
sumber
2
Ya, kelas sebenarnya dari enum tidak tersedia di sini untuk melakukan pemanggilan metode statis, hanya sebuah instance dari beberapa subtipe Enum.
ColinD
3

Di sini, Peran adalah enum yang berisi nilai berikut [ADMIN, USER, OTHER].

List<Role> roleList = Arrays.asList(Role.values());
roleList.forEach(role -> {
    System.out.println(role);
    });
Ashwani Sharma
sumber
Namun, ini tidak umum. Pertanyaannya adalah tentang kasus ketika hanya memiliki objek Enum. Jadi Anda harus pergi melalui mendeklarasikan kelas atau lebih baik, melalui EnumSet.
zeratul021
3

Anda juga bisa menggunakan java.util.EnumSet seperti ini

@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
sumber