Làm thế nào để lấy tất cả các giá trị enum trong Java?


95

Tôi đã gặp phải vấn đề này mà tôi không biết enumloại thực tế mà tôi cần để lặp lại các giá trị có thể của nó.

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

Bất kỳ ý tưởng làm thế nào để trích xuất từ ​​enumValue các giá trị có thể của nó?

Câu trả lời:


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

Tại sao bạn sử dụng getDecightsClass ()?
Peter Kriens,

3
@PeterKriens: Bởi vì getClass()trên một enumđối tượng có thể trả về một kiểu con của enumchính kiểu đó (nếu, chẳng hạn, enumhằng số ghi đè một phương thức từ enumkiểu). getDeclaringClass()trả về enumkiểu đã khai báo hằng số đó, đó là kiểu bạn muốn ở đây.
ColinD

Cảm ơn! Tôi đã không nhận ra trường hợp đó nhưng bạn nói đúng, hằng số có thể thuộc về một lớp bên trong ẩn danh.
Peter Kriens

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

Hoặc là

YourEnumClass[] yourEnums = YourEnumClass.values();

YourEnumClass[] yourEnums = YourEnumClass.class.getEnumConstants();đã giải quyết vấn đề của tôi khi gọi từ một phương thức không tĩnh.
Jeremy

15

Enums giống như Classes ở chỗ chúng được đánh máy. Mã hiện tại của bạn chỉ kiểm tra xem nó có phải là Enum hay không mà không chỉ định loại Enum mà nó là một phần.

Bởi vì bạn chưa chỉ định loại enum, bạn sẽ phải sử dụng sự phản chiếu để tìm ra danh sách các giá trị enum là gì.

Bạn có thể làm như vậy:

enumValue.getDeclaringClass().getEnumConstants() 

Điều này sẽ trả về một mảng các đối tượng Enum, với mỗi đối tượng là một trong các tùy chọn có sẵn.


14

phương thức giá trị của enum

Phương thức enum.values ​​() trả về tất cả các trường hợp 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


7

... hoặc MyEnum.values ​​()? Hay tôi đang thiếu cái gì đó?


2
Có, lớp thực sự của enum không có sẵn ở đây để thực hiện một cuộc gọi phương thức tĩnh, chỉ là một phiên bản của một số kiểu con của Enum.
ColinD

3

Ở đây, Vai trò là một enum chứa các giá trị sau [ADMIN, USER, OTHER].

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

Tuy nhiên, điều này không phải là chung chung. Câu hỏi là về trường hợp khi chỉ có đối tượng Enum. Vì vậy, bạn cần phải thông qua khai báo lớp hoặc tốt hơn, thông qua EnumSet.
zeratul021

3

Người ta cũng có thể sử dụng java.util.EnumSet như thế này

@Test
void test(){
    Enum aEnum =DayOfWeek.MONDAY;
    printAll(aEnum);
}

void printAll(Enum value){
    Set allValues = EnumSet.allOf(value.getClass());
    System.out.println(allValues);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.