java - example - enum.values()-es un orden de enums devueltos determinista
java lang enum example (4)
Está determinado por el orden en que se declaran sus valores. Sin embargo, no hay garantía de que usted (u otra persona) no vuelva a ordenar / insertar / eliminar valores en el futuro . Entonces no debes confiar en la orden.
Efectivo Java 2nd. Edition dedica su artículo 31 a un tema estrechamente relacionado: use campos de instancia en lugar de ordinales :
Nunca derive un valor asociado con una enumeración de su ordinal; guárdelo en un campo de instancia en su lugar.
Tengo una enumeración SOME_ENUM
:
public enum SOME_ENUM {
EN_ONE,
EN_TWO,
EN_THREE;
}
¿ SOME_ENUM.values()
siempre devolverá las enumeraciones en el orden de las declaraciones enum: EN_ONE, EN_TWO, EN_THREE
? ¿Es una regla o no está garantizado que no se modifique en las próximas versiones de JDK?
La especificación del lenguaje Java usa este lenguaje explícito:
@return una matriz que contiene las constantes de este tipo de enumeración, en el orden en que están declaradas [Source]
Entonces, sí, serán devueltos en orden de declaración. Vale la pena señalar que la orden puede cambiar con el tiempo si alguien cambia la clase, así que ten mucho cuidado con la forma de usarla.
Las otras respuestas son buenas, pero no comenten esto:
"¿Es una regla o no está garantizado que no se modifique en las próximas versiones de Jdk?"
No creo que existan garantías en futuros JDK, por lo que ni siquiera debería preocuparse por ellos. No habría forma de hacerlos cumplir, los futuros líderes JDK podrían decidir renegar de tales garantías. Es como el sistema del parlamento de Westminster: "Ningún Parlamento puede obligar a un futuro parlamento".
Dicho esto, la historia del JDK revela una excelente coherencia. No hacen muchos cambios bruscos, por lo que puede estar seguro de que se conservará el comportamiento especificado (no solo observado).
Sí, está garantizado devolverlos en ese orden.
Sin embargo, debe evitar confiar en eso y en el valor ordinal()
, ya que puede cambiar después de insertar nuevos elementos, por ejemplo.