Enum en Java

Estándar

El día de hoy tuve que lidiar con un nuevo tipo de dato en el lenguaje de programación Java: el tipo Enum.

Conociendo los enum

Según la documentación de Java sobre este tipo de dato, se dice que: “un tipo enum es un tipo de dato especial que permite a una variable ser un conjunto de constantes predefinidas”. En otras palabras, se podría decir que un tipo enum es un tipo de dato que el usuario define, el cual sólo puede tomar valores de una lista (véase lista como cualquier otra cosa menos un tipo List).

Y nos podemos preguntar: ¿para qué me serviría un enum? Bueno, respondo con preguntas: ¿cuántas veces necesitaste tener a la mano una lista de los días de la semana, los puntos cardinales?, ¿o alguna vez creaste un programa el cual trabaja con licencias, y quieres saber de qué tipo es la que tiene el usuario final? Bien, más claro no puedo decir: un tipo enum es un array de constantes, que tienen el mismo tipo que el enum.

¿Un ejemplo? Bien, hagamos un enum con los puntos cardinales:

package enums.punto;

public enum PuntoCardinal {
    NORTE,
    SUR,
    ESTE,
    OESTE
}

Ok, ese es un ejemplo simple. Y vemos algo nuevo: ya no tenemos nuestro “class”, en su lugar tenemos un “enum”. Deducimos entonces que un enum es una clase, así que debemos tratarla como tal. Ahora veamos cómo probarlo:

package enums.punto;

public class PruebaEnumPuntoCardinal {
    
    public static void main(String[] args) {
        
        PuntoCardinal p = PuntoCardinal.SUR;
        
        // Forma fácil de hacerlo, son constantes
        if (p == PuntoCardinal.SUR) {
            System.out.println("Perú queda en el SUR.");
        }
        
        // Forma POO para trabajar
        if (PuntoCardinal.SUR.equals(p)) {
            System.out.println("Perú queda en el SUR.");
        }
        
    }
    
}

Como podremos ver, podemos usar la POO para comprobar valores enum, o sino lo que aprendimos mucho antes y vemos en cualquier lenguaje: nuestro querido “==” 🙂

Un enum no es instanciable

Perfecto, pero ahora queremos hacer algo mucho más robusto, pues no es divertido aprender los puntos cardinales con Java. Entonces, ¿qué tal si asignamos un número a cada día de la semana?

package enums.semana;

public enum DiaSemana {
    
    DOMINGO(0),
    LUNES(1),
    MARTES(2),
    MIERCOLES(3),
    JUEVES(4),
    VIERNES(5),
    SABADO(6);
    
    public final int nroDia;
    
    private DiaSemana(int nroDia) {
        this.nroDia = nroDia;
    }
    
    public int getNroDia() {
        return nroDia;
    }
    
    public String getNombreDia() {
        return name();
    }
    
}

Según el código, podemos observar que a pesar que un enum es una clase, no es instanciable. Por lo tanto, si deseas prueba a hacer un “new DiaSemana(4)” y no podrás. Luego, otra pregunta que puede surgir es: ¿dónde declaraste el método name() al que llamas desde getNombreDia()? Mi respuesta es que todo enum hereda de la clase Enum, y viendo en la documentación de Java sabremos más. Bueno, probemos el código anterior:

package enums.semana;

public class PruebaEnumDiaSemana {
    
    public static void main(String[] args) {
        
        DiaSemana d = DiaSemana.DOMINGO;
        
        StringBuilder sb = new StringBuilder();
        sb.append("Hoy es ");
        sb.append(d.getNombreDia());
        sb.append(" y es número ");
        sb.append(d.getNroDia());
        sb.append(".");
        
        System.out.println(sb);
        
    }
    
}

Métodos heredados de Enum

Como ya dije antes, todo tipo enum hereda de la clase Enum de Java. Los métodos que hereda de ella son:

  • public final boolean equals(Object other): Devuelve TRUE si el objeto especificado es igual a esta constante. Sobrescribe el método “equals” de Object.
  • public final String name(): Devuelve en nombre de esta constante, tal y como fue declarada.
  • public final int ordinal(): Devuelve la posición de la constante según la declaración de éstas. A la primera constante declarada se le asigna 0.
  • public String toString(): Devuelve lo mismo que name(), pero sobrescribe “equals” de Object.
  • public static enumConstant[] values(): Devuelve un array con las constantes declaradas.

El porqué hice esto

Me animé a leer esto luego de tener que lidiar con algún código sacado de Zend Studio 10.5, el cual expongo:

package com.zend.php.core.core.key;

public enum SKU {
    
    SUBSCRIPTION(1, "Zend Studio Subscription"),
    IBM(2, "Zend Studio Standard for IBM-I"),
    PERPETUAL(3, "Zend Studio Perpetual");
    
    public final int index;
    public final String description;
    
    private SKU(int index, String description) {
        this.index = index;
        this.description = description;
    }
    
    public static final SKU byIndex(int index) {
        SKU[] values = values();
        for (SKU sku : values) {
            if (sku.index == index) {
                return sku;
            }
        }
        return null;
    }
    
}

Y luego de ver un código tipo “parche” en el que el creador intentó igualar el enum con una clase, preferí aprender algo sobre los enum antes que igualarlo con clases.

Bien, eso ha sido todo. Como siempre, los archivos usados están en este link.

Anuncios