2009-10-26 43 views
49

Tôi đã có đối tượng lớp cho một enum (Tôi có một Class<? extends Enum>) và tôi cần để có được một danh sách các giá trị liệt kê đại diện bởi enum này. Chức năng tĩnh values có những gì tôi cần, nhưng tôi không biết cách truy cập vào nó từ đối tượng lớp.Java Enums: Liệt kê các giá trị được liệt kê từ một Class <? mở rộng Enum>

+0

tĩnh của nó - phản ánh. – IAdapter

+0

'Lớp' là một đối tượng phản chiếu (nó đặt trước gói). –

Trả lời

10

sử dụng phản ánh là đơn giản như gọi Class#getEnumConstants():

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

Nếu bạn biết tên của các giá trị mà bạn cần:

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

Nếu không, bạn có thể nhận được một mảng của họ bởi (như Tom đã đến đầu tiên):

 klass.getEnumConstants(); 
3

Tôi ngạc nhiên khi thấy rằng EnumSet#allOf() không được đề cập:

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

Tạo một bộ enum chứa tất cả các yếu tố trong các loại yếu tố quy định.

Hãy xem xét những điều sau enum:

enum MyEnum { 
    TEST1, TEST2 
} 

Đơn giản chỉ cần gọi phương thức như thế này:

Set<MyEnum> allElementsInMyEnum = EnumSet.allOf(MyEnum.class); 

Tất nhiên, điều này trả về một Set, không phải là một List, nhưng nó phải là đủ nhiều trường hợp sử dụng.

Hoặc, nếu bạn có một không rõ enum:

Class<? extends Enum> enumClass = MyEnum.class; 
Set<? extends Enum> allElementsInMyEnum = EnumSet.allOf(enumClass); 

Ưu điểm của phương pháp này, so với Class#getEnumConstants(), là nó được đánh máy để nó không thể vượt qua bất cứ điều gì khác hơn là một enum với nó . Ví dụ, đoạn code dưới đây là hợp lệ và trả null:

String.class.getEnumConstants(); 

Trong khi điều này sẽ không biên dịch:

EnumSet.allOf(String.class); // won't compile 
Các vấn đề liên quan