¿Cuál es la forma más fácil y / o más corta posible de obtener los nombres de los elementos enum como una matriz de String
s?
Lo que quiero decir con esto es que si, por ejemplo, tuviera la siguiente enumeración:
public enum State {
NEW,
RUNNABLE,
BLOCKED,
WAITING,
TIMED_WAITING,
TERMINATED;
public static String[] names() {
// ...
}
}
el names()
método devolvería la matriz { "NEW", "RUNNABLE", "BLOCKED", "WAITING", "TIMED_WAITING", "TERMINATED" }
.
Respuestas:
Aquí hay una sola línea para cualquier
enum
clase:Pre Java 8 sigue siendo de una sola línea, aunque menos elegante:
Que llamarías así:
Si solo desea algo simple para una clase de enumeración codificada:
fuente
e.getEnumConstants()
usted puede usarYourEnumName.values()
YourEnumName.values()
está llamando a un método estático en la clase, que no se puede reutilizar para ninguna enumeración. El usogetEnumConstants()
funciona para cualquier clase de enumeración. La idea con este método es recrear un método de utilidad que pueda llamar como la última línea de la respuesta.Class<? extends Enum<?>> e
?Cree una
String[]
matriz para los nombres y llame alvalues()
método estático que devuelve todos los valores de enumeración, luego itere sobre los valores y complete la matriz de nombres.fuente
values()
13 veces, generando una nueva matriz cada vez, en lugar de almacenar en caché la matriz en una variable local? ¿Por qué usar toString (), que es reemplazable, en lugar dename()
?name()
método hasta ahora. qué estúpido de mi parte: P gracias porAquí tienes una solución elegante usando Apache Commons Lang 3 :
Aunque devuelve una lista, puede convertir la lista fácilmente con
list.toArray()
fuente
EnumUtils.getEnumList(enumClass)
devuelve los valores de enumeración, no las cadenas. Podría utilizarEnumUtils.getEnumMap(enumClass).keySet()
, pero el orden puede ser diferente.Si puede usar Java 8, esto funciona bien (alternativa a la sugerencia de Yura, más eficiente):
fuente
Con java 8:
fuente
Lo escribiria asi
fuente
Algo como esto haría:
La documentación recomienda usar en
toString()
lugar dename()
en la mayoría de los casos , pero ha pedido explícitamente el nombre aquí.fuente
values()
se llama dos veces cuando solo es necesario llamar una vez.values()
es un método generado por el compilador, así que supongo que está bastante optimizado. Finalmente, recuerdo haber leído en alguna parte que los bucles for-each son más eficientes que los bucles for estándar, incrementales, pero, de nuevo, simplemente no importa .for (int i = 0; i < a.length; i++) /* do stuff */;
en este caso, los bucles for-each son , de hecho, más eficientes. Una búsqueda rápida de SO sobre el tema nos da esto: stackoverflow.com/questions/2113216/…Otras formas:
El primero
Otra manera
fuente
toString()
funciona, pero en el caso general no lo hace, yatoString()
que se puede anular. Úselo.name()
para obtener de manera confiable el nombre de la instancia como una cadena.Mi solución, con manipulación de cadenas (no es la más rápida, pero es compacta):
fuente
Lo haría de esta manera (pero probablemente convertiría los nombres en un conjunto no modificable en lugar de una matriz):
fuente
names()
método solo se llama con moderación, creo que generar una matriz en el lugar está bien.Tengo la misma necesidad y uso un método genérico (dentro de una clase ArrayUtils):
Y simplemente defina una ESTÁTICA dentro de la enumeración ...
Las enumeraciones de Java realmente extrañan los métodos de names () y get (index), son realmente útiles.
fuente
la forma ordinaria (juego de palabras intencionado):
fuente
Hice una pequeña prueba en la solución de @ Bohemian. El rendimiento es mejor cuando se usa un bucle ingenuo.
fuente
org.apache.commons.lang3.EnumUtils.getEnumMap (State.class) .keySet ()
fuente
EnumUtils
?Si quieres lo más corto puedes probar
fuente
vales()
una vez)Solo un pensamiento: tal vez no necesite crear un método para devolver los valores de la enumeración como una matriz de cadenas.
¿Por qué necesita la matriz de cadenas? Tal vez solo necesite convertir los valores cuando los use, si alguna vez necesita hacerlo.
Ejemplos:
fuente
Otra forma de hacerlo en Java 7 o anterior sería usar Guava:
fuente
Prueba esto:
fuente
Puede poner valores de enumeración en la lista de cadenas y convertirlos en una matriz:
fuente
La forma más fácil:
Donde Categoría es
Enum
nombrefuente