2013-04-22 25 views
55

Tôi muốn để điền vào một danh sách với tất cả các giá trị có thể của một enum
Kể từ khi tôi gần đây đã yêu EnumSet, tôi thừa hưởng allOf()
java Danh sách fill với tất cả các enum giá trị

EnumSet<Something> all = EnumSet.allOf(Something.class); 
List<Something> list = new ArrayList<>(all.size()); 
for(Something s : all) { 
    list.add(s); 
} 
return list; 

Có tốt hơn cách (như trong một obfuscated một lót) để đạt được kết quả tương tự?

+0

ArrayList list = ArrayList mới (Arrays.asList (Something.values())) – TacB0sS

Trả lời

115

Tôi sẽ không sử dụng một danh sách ở nơi đầu tiên s như một EnumSet là approriate hơn nhưng bạn có thể làm

List<Something> somethingList = Arrays.asList(Something.values()); 

hoặc

List<Something> somethingList = 
       new ArrayList<Something>(EnumSet.allOf(Something.class)); 
+3

Đôi khi EnumSet không cắt nó. Cụ thể là khi đơn đặt hàng quan trọng – MonoThreaded

+1

@MonoThreaded Bạn đã nhớ thứ tự nào? Một EnumSet là thứ tự cho một enum. Danh sách sẽ theo thứ tự như tập hợp, vì vậy việc sử dụng Danh sách sẽ không thay đổi bất cứ điều gì ở đây. –

+1

Xin lỗi, đặt hàng nằm ngoài phạm vi cho câu hỏi này. Tôi tin rằng bạn có nghĩa là giá trị() trong ví dụ đầu tiên. – MonoThreaded

0

Đây là dễ đọc hơn một chút:

Object[] allValues = all.getDeclaringClass().getEnumConstants(); 
+1

Sau đó, bạn có thể chỉ đơn giản là làm 'Something.class.getEnumConstants()' phải không? – shyam

+1

... hoặc 'Something.values ​​(); ' –

+0

Điểm tốt. Java của tôi rõ ràng là gỉ! – BlackVegetable

9

Có một constructor cho ArrayList đó là

ArrayList(Collection<? extends E> c) 

Bây giờ, EnumSet kéo dài AbstractCollection vì vậy bạn chỉ có thể làm

ArrayList<Something> all = new ArrayList<Something>(enumSet) 
1
List<Something> result = new ArrayList<Something>(all); 

EnumSet là một Bộ sưu tập Java, vì nó thực hiện các giao diện Set:

public interface Set<E> extends Collection<E> 

Vì vậy, bất cứ điều gì bạn có thể làm với Bộ sưu tập bạn có thể thực hiện với một số EnumSet.

6

thử

enum E { 
    E1, E2, E3 
} 

public static void main(String[] args) throws Exception { 
    List<E> list = Arrays.asList(E.values()); 
    System.out.println(list); 
} 
+0

Bố cục kém nhưng cách tiếp cận tốt đẹp :) – MonoThreaded

+0

đáng làm rõ rằng bạn không nhận được một java.util.ArrayList trong số này, như đã nêu trong câu hỏi – planetjones

0

Hãy thử điều này:

... = new ArrayList<Something>(EnumSet.allOf(Something.class)); 

như ArrayList có một constructor với Collection<? extends E>. Nhưng chỉ sử dụng phương pháp này nếu bạn thực sự muốn sử dụng EnumSet.

Tất cả các enums đều có quyền truy cập vào phương thức values(). Nó trả về một mảng của tất cả các giá trị enum:

... = Arrays.asList(Something.values()); 
0

Bạn có thể sử dụng thêm:

Collections.singletonList(Something.values()) 
Các vấn đề liên quan