recorrer - java enum with values
Enum values(). Length versus private field (4)
Al almacenar el conteo, estás violando el principio DRY , así que a menos que tengas una muy buena razón, no deberías.
Tengo una enumeración como esta:
public enum Configuration {
XML(1),
XSLT(10),
TXT(100),
HTML(2),
DB(20);
private final int id;
private Configuration(int id) {
this.id = id;
}
public int getId() { return id; }
}
A veces necesito verificar cuántos campos tengo en la enumeración. ¿Cuál es la mejor solución? ¿Debo usar un método "values (). Length"? O tal vez, debo crear un campo constante en la enumeración de esta manera:
public enum Configuration {
XML(1),
XSLT(10),
TXT(100),
HTML(2),
DB(20);
private final int id;
private Configuration(int id) {
this.id = id;
}
public int getId() { return id; }
public static final int Size = 5;
}
¿Cuál es la solución más rápida y más elegante?
Otro enfoque es usar una constante inicializada sobre el método de valores ().
public enum Colors {
BLUE, GREEN, FUCHSIA;
public static int COUNT = Colors.values().length;
}
De esta forma, tienes una constante actualizada automáticamente y aún evitas esa sobrecarga de "valores ()".
Usar values().length
creará una nueva copia de la matriz cada vez que la llame. A veces creo mi propia List
(o conjunto, o mapa, lo que sea que necesito) para evitar esta copia inútil. Aunque no lo codificaría ... si solo necesitas el tamaño, solo usaría:
private static final int size = Configuration.values().length;
al final. Para cuando se evalúe, todos los valores se habrán inicializado. Esto evita las preocupaciones SECO e incoherencias planteadas en otras respuestas.
Por supuesto, esto es un poco de una micro-optimización en sí misma ... pero una que termina con un código más simple al final, IMO. La values().length
de los values().length
llamada values().length
desde otro lugar no expresa lo que le interesa, que es solo el tamaño de la enumeración; el hecho de que lo haga a través de una matriz de valores es incidental y distrayente, IMO.
Una alternativa al uso de values()
es usar EnumSet.allOf().size()
que para las enumeraciones pequeñas será bastante barato, pero una vez más, no es tan fácil de leer como tener un campo de size
.
Yo recomendaría usar values().length
. Esto es mucho más elegante y la sobrecarga de rendimiento versus el uso de una constante será insignificante. Además, elimina el riesgo de que la constante se desfase con la duración real de la enumeración.