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?


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));

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)

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);
}

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.


0

Esto es un poco más legible:

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

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());


-2
private ComboBox gender;
private enum Selgender{Male,Famle};
ObservableList<Object> observableList  =FXCollections.observableArrayList(Selgender.values());
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.