Enum en Java
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.
[smartads]
¿Un ejemplo? Bien, hagamos un enum con los puntos cardinales:
package enums.punto; public enum PuntoCardinal { NORTE, SUR, ESTE, OESTE }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.
Fuente: bryanjhvtk
El porqué hice esto
Aqui les dejo un ejemplo completo para buscar los Enum por ID o filtrar por tipo:
[smartads]
package enume; public enum DiaSemana { DOMINGOS(0,"Es día Domingo en buhoos.com","TIPO_A"), LUNES(1,"Es día Lunes en buhoos.com","TIPO_A"), MARTES(2,"Es día Martes en buhoos.com","TIPO_A"), MIERCOLES(3,"Es día Miércoles en buhoos.com","TIPO_A"), JUEVES(4,"Es día Jueves en buhoos.com","TIPO_B"), VIERNES(5,"Es día viernes en buhoos.com","TIPO_B"), SABADO(6,"Es día Sábado en buhoos.com","TIPO_B"); public final int numeroDia; public final String description; public final String tipo; private DiaSemana(int nroDia, String descripcion, String tipo) { this.numeroDia = nroDia; this.description = descripcion; this.tipo=tipo; } public int getNumeroDia() { return numeroDia; } public String getDescripcion(){ return description; } public String getTipo() { return tipo; } public String getNombreDia() { return name(); } public static DiaSemana[] listaEstados(){ return values(); } public static DiaSemana[] listaEstadosPorTipo(String tipo){ DiaSemana[] values = values(); DiaSemana[] values2 = new DiaSemana[values.length]; int i=0; for (DiaSemana diaSemana : values) { if(diaSemana.getTipo()==tipo){ values2[i]=diaSemana; i++; } } return values2; } public static final DiaSemana buscarPorId(int nroDia){ DiaSemana[] values = values(); for (DiaSemana dia : values) { if (dia.numeroDia == nroDia) { return dia; } } return null; } }