====== Enumeraciones =======

Las enumeraciones o tipos enumerados en Java son un tipo de dato al que se le pueden definir una serie limitada de posibles valores, que
además podemos definir en el momento de la creación de esa enumeración.

<code java>
. . .
public enum Direccion {
    ARRIBA, ABAJO, IZQUIERDA, DERECHA
}
. . .
private Direccion direccion;
. . .
direccion = Direccion.ARRIBA;
. . .
direccion = Direccion.ABAJO;
. . .
switch (direccion) {
    case ARRIBA:
        . . .
        break;
    case ABAJO:
        . . .
        break;
    case DERECHA:
        . . .
        break;
    case IZQUIERDA:
        . . .
        break;
}
</code>

En el ejemplo anterior, se ha definido una enumeración \verb Direccion  que define 4 posibles valores. Más adelante se ha declarado una
variable \verb direccion  del tipo enumerado, que vemos cómo puede tomar cualquiera de los valores del tipo enumerado (y ninguno otro), y
más adelante se puede ver lo cómodo que es utilizar un tipo enumerado con un switch para evaluar su valor, con un código mucho más legible
que si hubieramos utilizado una variable de tipo \verb String  o bien 4 constantes independientes. Hay que tener en cuenta que el uso de las
enumeraciones minimiza la posibilidad de error puesto que la variable nunca podrá tomar un valor que no le corresponda según el tipo
enumerado con el que fue definido, algo que si podría ocurrir si utilizaramos un \verb String  , constantes o cualquier otra fórmula que se
nos pudiera ocurrir.

También es posible declarar enumeraciones como una clase con la finalidad de añadir atributos y métodos. Por defecto, se incluyen algunos
métodos que pueden ser de gran utilidad:

<code java>
. . .
Direccion direccion = Direccion.ARRIBA;
System.out.println(direccion.name());       // "ARRIBA"
System.out.println(direccion);              // "ARRIBA"
String arriba = direccion.name();           // "ARRIBA"

// Lista todos los valores posibles de la enumeración
for (Direccion dir : Direccion.values())
    System.out.println(dir);          

Direccion direccionArriba = Direccion.valueOf("ARRIBA");    // Direccion.ARRIBA
. . .
</code>

Y también es posible, en el momento de definir un tipo enumerado, añadir constructor, atributos y métodos, para usarlo como si de una clase
Java se tratara.

<code java>
public enum Estacion {
    PRIMAVERA (10, 20.5f),
    VERANO (23, 40),
    OTONO (5.3f, 15),
    INVIERNO (-2.1f, 10);

    private final float temperaturaMinima;
    private final float temperaturaMaxima;

    Estacion(float temperaturaMinima, float temperaturaMaxima) {
        this.temperaturaMinima = temperaturaMinima;
        this.temperaturaMaxima = temperaturaMaxima;
    }
    
    public float temperaturaMinima() { return temperaturaMinima; }
    public float temperaturaMaxima() { return temperaturaMaxima; }
    public float diferenciaTemperatura() { 
        return (temperaturaMaxima - temperaturaMinima); 
    }
}

. . .

Estacion primavera = Estacion.PRIMAVERA;
System.out.println(primavera.temperaturaMinima());    // 10.0
System.out.println(primavera.diferenciaMinima());    // 10.5
. . .
</code>

----

(c) 2019-{{date>%Y}} Santiago Faci