Java Design Patterns: ¿Como representar una enumeración de objetos en Java?



Suponga que usted quiere representar una enumeración de objetos en Java, also asi como los días de la semana (Lunes, Martes, …, Domingo). Una forma es crear una clase con un arreglo con los nombres de los días de la semana en un arreglo, ¿no? Sin embargo no es lo mismo que una enumeración como las usadas en C (las cuales eran una secuencia de números).

En Java esto se puede lograr utilizando un patrón de diseño llamado “Enumeration Pattern”. En este caso reemplazamos el simple arreglo por una clase como la siguiente (por favor disculpen el código, pero Blogger es una porquería cuando se trata de mostrar código con la identación apropiada):

import java.util.List;

import java.util.Collections;

import java.util.Arrays;

/**

* This class represents an enumeration of the days of the Week

* @author Jose Vicente Núñez Zuleta (josevnz@sourceforge.net)

* @version 0.1 – 11/17/2004

*/

public final class SimpleEnumeration {

private String day;

private static int instanceCount = 0;

private int currentOrdinal = 0;

/**

* Day Monday

*/

public static final SimpleEnumeration MONDAY = new SimpleEnumeration(“Monday”);

/**

* Day Thuesday

*/

public static final SimpleEnumeration TUESDAY = new SimpleEnumeration(“Thuesday”);

/**

* Day Wednesday

*/

public static final SimpleEnumeration WEDNESDAY = new SimpleEnumeration(“Wednesday”);

/**

* Day Thursday

*/

public static final SimpleEnumeration THURSDAY = new SimpleEnumeration(“Thursday”);

/**

* Day Friday

*/

public static final SimpleEnumeration FRIDAY = new SimpleEnumeration(“Friday”);

/**

* Day Saturday

*/

public static final SimpleEnumeration SATURDAY = new SimpleEnumeration(“Saturday”);

/**

* Day Sunday

*/

public static final SimpleEnumeration SUNDAY = new SimpleEnumeration(“Sunday”);

private static final SimpleEnumeration [] PRIVATE_LIST = { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY };

/**

* Days of the week as a List

*/

public static final List LIST = Collections.unmodifiableList(Arrays.asList(PRIVATE_LIST));

/**

* Hide the constructor

*/

private SimpleEnumeration(String day) {

this.day = day;

currentOrdinal = ++instanceCount;

};

/**

* Compare if two days are equal

* @param object Day of the week to compare. It must be an instance of SimpleEnumeration, otherwise a IllegalArgumentException will be throw

* @return int 0 if equal, 1 if greather, -1 if less

*/

public int compareTo(Object object) {

if (object instanceof SimpleEnumeration) {

SimpleEnumeration instance = (SimpleEnumeration) object;

if (instance.currentOrdinal > instance.currentOrdinal) {

return 1;

} else if (instance.currentOrdinal < instance.currentOrdinal) {
return -1;

} else {

return 0;

}

} else {

throw new IllegalArgumentException();

}

}

/**

* Return the name of the given day

* @return Day of the week

* @since 0.1

*/

public String toString() {

return day;

}

/**

* Test the class functionality

* @param args

* @since 0.1

*/

public static void main(String [] args) {

System.out.println(“First day of the week: ” + SimpleEnumeration.MONDAY);

System.out.println(LIST);

}

}

Veamos cual es la salida:

josevnz@localhost effective]$ java SimpleEnumeration

First day of the week: Monday

[Monday, Thuesday, Wednesday, Thursday, Friday, Saturday, Sunday]

[josevnz@localhost effective]$

¿Genial no?. Lo mejor de este patrón de diseño es que su uso es trivial :).