Füllen einer Liste mit allen Aufzählungswerten in Java

80

Ich möchte eine Liste mit allen möglichen Werten einer Aufzählung füllen.
Da ich mich kürzlich in sie verliebt habe EnumSet, habe ich sie genutztallOf()

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

Gibt es einen besseren Weg (wie bei einem nicht verschleierten Einzeiler), um das gleiche Ergebnis zu erzielen?

MonoThreaded
quelle
ArrayList <Something> list = new ArrayList <Something> (Arrays.asList (Something.values ​​()))
TacB0sS

Antworten:

168

Ich würde eine Liste an erster Stelle nicht verwenden, da ein EnumSet angemessener ist, aber Sie können es tun

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

oder

List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));
Peter Lawrey
quelle
3
Manchmal schneidet EnumSet es nicht. Insbesondere wenn es auf die Bestellung ankommt
MonoThreaded
1
@MonoThreaded Welche Reihenfolge hatten Sie im Sinn? Ein EnumSet ist in der natürlichen Reihenfolge für eine Aufzählung. Die Liste befindet sich in derselben Reihenfolge wie das Set, sodass durch die Verwendung einer Liste hier nichts geändert wird.
Peter Lawrey
1
Leider ist die Bestellung für diese Frage nicht möglich. Ich glaube, Sie haben im ersten Beispiel Werte () gemeint.
MonoThreaded
@ PeterLawrey wir verwenden die ganze Zeit Enums. Wenn wir einen Workflow entwerfen, wird der Genehmigungsprozess möglicherweise nicht in Natural Orderdie Enum verschoben. Aus diesem Grund ist a List<Enum>im Vergleich zu an nützlich EnumSet.
Buzzsawddog
12

Class.getEnumConstants()

List<SOME_ENUM> enumList = Arrays.asList(SOME_ENUM.class.getEnumConstants());
AZ_
quelle
10

Es gibt einen Konstruktor, für ArrayListden

ArrayList(Collection<? extends E> c) 

Jetzt EnumSeterweitert, AbstractCollectionso dass Sie einfach tun können

ArrayList<Something> all = new ArrayList<Something>(enumSet)
Jack
quelle
8

Versuchen

enum E {
    E1, E2, E3
}

public static void main(String[] args) throws Exception {
    List<E> list = Arrays.asList(E.values());
    System.out.println(list);
}
Evgeniy Dorofeev
quelle
Hässliches Layout, aber nette Herangehensweise :)
MonoThreaded
Es lohnt sich zu klären, dass Sie keine java.util.ArrayList daraus erhalten, wie in der Frage angegeben
planetjones
@ MonoThreaded wie hässlich es ist? Sie bekommen, wonach Sie gefragt haben
Deadpool
1
List<Something> result = new ArrayList<Something>(all);

EnumSetist eine Java-Sammlung, da sie die SetSchnittstelle implementiert :

public interface Set<E> extends Collection<E> 

Alles, was Sie mit einer Sammlung tun können, können Sie mit einer Sammlung tun EnumSet.

planetjones
quelle
0

Dies ist etwas besser lesbar:

Object[] allValues = all.getDeclaringClass().getEnumConstants();
BlackVegetable
quelle
1
Dann könnten Sie einfach Something.class.getEnumConstants()richtig machen?
Shyam
1
... oderSomething.values();
Peter Lawrey
0

Versuche dies:

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

wie ArrayListhat ein Konstruktor mit Collection<? extends E>. Verwenden Sie diese Methode jedoch nur, wenn Sie sie wirklich verwenden möchten EnumSet.

Alle Aufzählungen haben Zugriff auf die Methode values(). Es gibt ein Array aller Aufzählungswerte zurück:

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

Sie können auch verwenden:

Collections.singletonList(Something.values())
Topera
quelle
Ich bekomme hexCode
P Satish Patro
-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
سيدا الشايقي
quelle