Enums
¿Que es un enum?
enum
viene de la palabra enumerar (no me digas xd), en Java los enums sirven como una herramienta dentro del codigo para enumerar o organizar conceptos que esten directamente relacionados entre sí, por ejemplo:
Loading graph...
Los enum permiten agrupar estos conceptos en un objeto estatico, los conceptos agrupados dentro de un enum
se conocen como constantes en Java.
Para declarar un enum se debe hacer de la siguiente manera:
enum Planetas {
MERCURIO
VENUS
TIERRA
MARTE
JUPITER
SATURNO
URANO
NEPTUNO
}
Para acceder a una constante: Planetas.SATURNO
Metódos
Los enums continen metódos por defecto, los cuales permiten acceder de distinta forma a las constantes agrupadas.
Loading graph...
-
Metodos de constante: Se debe acceder a una constante para utilizarlos.
Planetas.SATURNO.toString()
-
Metodos de instancia: Aquellos que se llaman directamente en el enum, sin acceder primero a la constante.
Planetas.values()
Agregando metódos propios
Los enums de Java al ser considerado un objeto, se pueden añadir metódos y tambien campos!
Metódo de instancia
En el siguiente ejemplo crearemos un metódo de instancia, esto quiere decir que sólo será accesible directamente en el enum Planeta y no en sus constantes.
enum Planetas {
MERCURIO
VENUS
TIERRA
MARTE
JUPITER
SATURNO
URANO
NEPTUNO
public static Planetas getConstantByOrdinal(int ordinal) {
// se puede llamar directamente al metódo de instancia 'values()'
for(Planetas planeta: values()){
if(ordinal == planeta.ordinal()) {
return planeta;
}
}
}
}
Planetas.getConstantByOrdinal(3) // return TIERRA
Al igual que en una clase, el metódo se debe ser estatico, ya que no se esta accediendo a ninguna constante en particular.
Metódo de constante
En este caso al ser un metódo de constante, el metódo sólo será accessible luego de acceder a alguna constante.
ej. Colores.ROJO.miMetodo()
Las constantes son parecidas a las instancias tipo “singleton” en las cuales se crea una sola instancia durante toda la ejecución del programa, es decir, no se puede crear una nueva instancia. En los enums se debe declarar un constructor que asignará valores con los campos asociados a cada constante.
enum Colores {
ROJO(255, 0, 0)
NARANJA(255, 165, 0)
AMARILLO(255, 255, 0)
VERDE(0, 255, 0)
AZUL(0, 0, 255)
ANIL(0, 0, 128)
VIOLETA(128, 0, 128)
private int red;
private int green;
private int blue;
Colores(int red, int green, int blue ) {
this.red = red;
this.green = green;
this.blue = blue;
}
public int getRedValue() {
return this.red;
}
public int getGreenValue() {
return this.green;
}
public int getBlueValue() {
return this.blue;
}
}
Colores.NARANJA.getRedValue() // 255
Colores.NARANJA.getGreenValue() // 165
Colores.NARANJA.getBlueValue() // 0
Colores.VIOLETA.getRedValue() // 128
Colores.VIOLETA.getGreenValue() // 0
Colores.VIOLETA.getBlueValue() // 128
Las constantes estan acompañadas de unos parentesis dentró de los cuales existen valores, estos valores pueden ser de cualquier tipo, en este ejemplo hacen referencia a los valores RGB, es decir, COLOR(r, g, b)
.
Cuando accedemos a una constante Colores.NARANJA.getRedValue()
El constructor asignará automaticamente como argumentos los valores que están dentro de los parentesis.
Loading graph...
El diagrama anterior explica el flujo de relación entre los valores que posee la constante dentro de los parentesis y como el constructor los recibe automaticamente como argumentos.
Esto aplica para todas las constantes que definamos dentro del enum
y asignara los valores que se encuentran dentro de los parentesis automaticamente dependiendo de la constante a la cual estamos accediendo.
Conclusión
Los enums pueden ayudarnos a establecer una organización en el código y entregarnos seguridad a través de valores tipados, ya que, restringe los valores que puede tomar una variable. El hecho de que sé puedan crear metodos y campos propios dentro de un enum, abre una infinidad de posibilidades para su uso.
Algunos casos de uso reales pueden ser:
- Representar estados en una máquina de estados finitos.
- Definir valores constantes para permisos, roles o tipos de datos.
- Implementar conjuntos de valores discretos, como los días de la semana o los meses del año.
Si no estás utilizando enums en tu código Java, te recomiendo que consideres hacerlo.