Llenar una lista con todos los valores de enumeración en Java

80

Me gustaría llenar una lista con todos los valores posibles de una enumeración.
Desde que me enamoré recientemente EnumSet, aprovechéallOf()

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

¿Existe una mejor manera (como en un trazador de líneas no ofuscado) para lograr el mismo resultado?

Mono Roscado
fuente
ArrayList <Algo> list = new ArrayList <Algo> (Arrays.asList (Algo.valores ()))
TacB0sS

Respuestas:

169

No usaría una Lista en los primeros lugares ya que un EnumSet es más apropiado, pero puede hacerlo

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

o

List<Something> somethingList =
                 new ArrayList<Something>(EnumSet.allOf(Something.class));
Peter Lawrey
fuente
3
A veces, EnumSet no lo corta. En particular cuando el orden importa
MonoThreaded
1
@MonoThreaded ¿Qué orden tenías en mente? Un EnumSet está en el orden natural de una enumeración. La lista estará en el mismo orden que el conjunto, por lo que usar una Lista no cambia nada aquí.
Peter Lawrey
1
Lo sentimos, el pedido está fuera del alcance de esta pregunta. Creo que te refieres a valores () en el primer ejemplo.
MonoThreaded
@PeterLawrey usamos Enums todo el tiempo. Cuando diseñamos un flujo de trabajo, es posible que el proceso de aprobación no se mueva en Natural Orderel Enum, es por eso que un List<Enum>es útil frente a un EnumSet.
buzzsawddog
EnumSetno tiene un get()método (acceso aleatorio fácil) mientras que Listsí. Esto puede ser importante para lo que sea que List / EnumSet esté destinado a ser utilizado
pallgeuer
10

Hay un constructor para el ArrayListcual es

ArrayList(Collection<? extends E> c) 

Ahora, se EnumSetextiende AbstractCollectionpara que puedas hacer

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

tratar

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
fuente
Diseño feo pero buen enfoque :)
MonoThreaded
Vale la pena aclarar que no obtiene un java.util.ArrayList de esto, como se indica en la pregunta
planetjones
@MonoThreaded ¿cómo es feo? obtienes lo que pediste
CA Arefe
1
List<Something> result = new ArrayList<Something>(all);

EnumSetes una colección de Java, ya que implementa la Setinterfaz:

public interface Set<E> extends Collection<E> 

Entonces, cualquier cosa que pueda hacer con una colección, puede hacerlo con un EnumSet.

planetjones
fuente
0

Esto es un poco más legible:

Object[] allValues = all.getDeclaringClass().getEnumConstants();
NegroVegetal
fuente
1
Entonces, ¿podría simplemente hacer lo Something.class.getEnumConstants()correcto?
shyam
1
... oSomething.values();
Peter Lawrey
0

Prueba esto:

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

como ArrayListtiene un constructor con Collection<? extends E>. Pero use este método solo si realmente desea usar EnumSet.

Todas las enumeraciones tienen acceso al método values(). Devuelve una matriz de todos los valores de enumeración:

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

También puede utilizar:

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