Skip to content

Enums en Java

Published:

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...

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:

Si no estás utilizando enums en tu código Java, te recomiendo que consideres hacerlo.

Oracle Java docs - Enums

W3 - Java enums