Las enumeraciones enum, y los mapas de enumeraciones EnumMap, son un par de utilidades de las librerías de Java, que nos pueden ayudar a mantener fácilmente lotes de información estructurada. Además, las enumeraciones y los mapas de enumeraciones son objetos muy eficientes. Son eficientes tanto en coste temporal como espacial, ya que están especialmente optimizados para tamaños de conjuntos de datos predefinidos.
Este es un howto o codekata para comenzar rápido a usar las enumeraciones, y los EnumMap.
Las enumeraciones simples
Consisten en un listado de posibilidades dentro de un objeto. Por ejemplo, una enumeración de estados:
enum Enumeration1 {
ESTADO1,
ESTADO2,
ESTADO3,
}
Una forma de usar esta enumeración podría ser guardando el estado actual en una variable:
Enumeration1 currentStatus = Enumeration1.ESTADO3;
System.out.println("Current status: " + currentStatus);
Enumeraciones mejoradas
Una forma de añadir funcionalidades a una enumeración simple, podría ser el añadir todo tipo de datos asociados a cada elemento de la enumeración. Es decir, la enumeración se convierte en una lista de elementos, asociados con información. Por ejemplo:
enum Enumeration2 {
ESTADO1("attribute1_1", "attribute1_2", 101),
ESTADO2("attribute2_1", "attribute2_2", 102),
ESTADO3("attribute3_1", "attribute3_2", 103);
private String attribute1;
private String attribute2;
private int attribute3;
Enumeration2(String attribute1, String attribute2,
int attribute3) {
this.attribute1 = attribute1;
this.attribute2 = attribute2;
this.attribute3 = attribute3;
}
public String getAttribute1() {
return this.attribute1;
}
public String getAttribute2() {
return this.attribute2;
}
public int getAttribute3() {
return this.attribute3;
}
}
Tenemos los mismos 3 estados, asociados cada uno con 3 datos. La forma de recorrerlos podría ser la siguiente:
for (Enumeration2 aux : Enumeration2.values()) {
System.out.println(aux.getAttribute1() + " " + aux.getAttribute2() + " " + aux.getAttribute3());
}
..que pintaría por pantalla lo siguiente:
..y se podría usar igual la primera enumeración, pero además con los métodos de acceso:
Enumeration2 currentStatus2 = Enumeration2.ESTADO3;
System.out.println("Current attribute2: " + currentStatus2.getAttribute2());
Qué son los EnumMap
Los EnumMap son una variante de entre de las utilidades de Java, que sirve para tener listados de cosas, indizados mediante una enumeración. Es decir, es una forma muy eficiente de implementar conjuntos de información de acceso muy rápido a memoria. Si el total de elementos no es variable, es decir, puede venir predefinido por una enumeración, mejor usar un EnumMap que un ArrayList o un HashMap como comentaba al principio del post.
Cómo crear un EnumMap
Al grano, si queremos por ejemplo almacenar objetos con información random, podríamos definir unos objetos así:
class RandomObject {
private String randomUuid = UUID.randomUUID().toString();
public String getRandomUuid() {
return this.randomUuid;
}
}
..y podríamos entonces crear un EnumMap, usando la Enumeration1 para indizar los RandomObject, así:
EnumMap<Enumeration1, RandomObject> enumerationMap = new EnumMap<>(Enumeration1.class);
RandomObject randomObject1 = new RandomObject();
RandomObject randomObject2 = new RandomObject();
RandomObject randomObject3 = new RandomObject();
enumerationMap.put(Enumeration1.ESTADO1, randomObject1);
enumerationMap.put(Enumeration1.ESTADO2, randomObject2);
enumerationMap.put(Enumeration1.ESTADO3, randomObject3);
System.out.println(enumerationMap.get(Enumeration1.ESTADO1).getRandomUuid());
System.out.println(enumerationMap.get(Enumeration1.ESTADO2).getRandomUuid());
System.out.println(enumerationMap.get(Enumeration1.ESTADO3).getRandomUuid());