2013-04-22 17 views
55

Vorrei riempire una lista con tutti i possibili valori di un enum
Dal momento che di recente sono innamorato di EnumSet, ho sfruttato la allOf()
java riempimento elenco con tutti enum valori

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

C'è un modo migliore (come in una fodera non offuscata) per ottenere lo stesso risultato?

+0

ArrayList list = new ArrayList (Arrays.asList (Something.values())) – TacB0sS

risposta

115

Non vorrei usare una lista in primo luogo s come un EnumSet è più approriate ma si può fare

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

o

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

A volte EnumSet non lo taglia. In particolare quando l'ordine è importante – MonoThreaded

+1

@MonoThreaded Che ordine avevi in ​​mente? Un EnumSet è nell'ordine naturale per un enum. L'elenco sarà nello stesso ordine del set, quindi l'utilizzo di un elenco non cambia nulla qui. –

+1

Siamo spiacenti, l'ordine non rientra nell'ambito di questa domanda. Credo che tu intendessi valori() nel primo esempio. – MonoThreaded

0

Questo è un po 'più leggibile:

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

Quindi potresti semplicemente fare 'Something.class.getEnumConstants()' giusto? – shyam

+1

... o 'Something.values ​​();' –

+0

Buoni punti. La mia java è chiaramente arrugginita! – BlackVegetable

9

C'è un costruttore per ArrayList che è

ArrayList(Collection<? extends E> c) 

Ora, EnumSet estende AbstractCollection quindi si può solo fare

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

EnumSet è una raccolta di Java, in quanto implementa l'interfaccia Set:

public interface Set<E> extends Collection<E> 

Così qualsiasi cosa tu possa fare con una Collezione che puoi fare con un EnumSet.

6

provare

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

Layout brutto ma buon approccio :) – MonoThreaded

+0

vale la pena chiarire che non si ottiene una java.util.ArrayList da questo, come indicato nella domanda – planetjones

0

Prova questo:

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

come ArrayList ha un costruttore con Collection<? extends E>. Ma usa questo metodo solo se vuoi davvero usare EnumSet.

Tutte le enumerazioni hanno accesso al metodo values(). Esso restituisce un array di tutti i valori enum:

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

È possibile utilizzare anche:

Collections.singletonList(Something.values())