Enumerados en java

De ChuWiki

Uso básico[editar]

Desde java 5 tenemos la posibilidad de definir enumerados enum. Es como una clase más que se define de esta forma

// Fichero Precio.java
public enum Precio {
   BARATO,
   MEDIO,
   CARO;
}

Una vez definido, se puede usar así

Precio a = Precio.CARO;
Precio b = Precio.BARATO;
if (Precio.MEDIO.equals(a)) {
   System.out.println ("a tiene precio "+Precio.MEDIO);
}

toString() y valueOf()[editar]

Por defecto, el método toString() de un enum devuelve el literal que hemos puesto. Así, Precio.MEDIO.toString(), devuelve "MEDIO". El método contrario, valueOf(), es capaz de devolver un enum a partir del String que es su literal. Así, por ejemplo, Precio.valueOf("MEDIO") devuelve Precio.MEDIO

String nombre = Precio.MEDIO.toString(); // nombre adquiere el valor "MEDIO"
Precio precio = Precio.valueOf("MEDIO");  // precio vale ahora Precio.MEDIO

Definir toString()[editar]

Hemos comentado que si escribimos el enum como en pantalla así

System.out.println(Precio.CARO);

se llama al método toString() del enum, que por defecto coge los literales tal cual, es decir, "CARO", "MEDIO" y "BARATO". Sin embargo, en el enum podemos definir nuestro propio método toString().

public enum Precio {
   BARATO,
   MEDIO,
   CARO;

   public String toString() {
      return "soy un poco " + super.toString();
   }
}

así, al escribir Precio.CARO, obtendremos "soy un poco CARO".

Si definimos toString(), debemos tener claro que no estamos modificando valueOf(), por lo que Precio.valueOf("soy un poco CARO") no funcionará y debemos seguir usando Precio.valueOf("CARO") para obtener Precio.CARO

Definir constructores y atributos[editar]

En un enum podemos también, al igual que en otras clases, definir constructores con parámetros y atributos. Imagina en el ejemplo que nos gustaría tener en algún sitio entre qué precios es CARO, BARATO o MEDIO una cosa. El mejor sitio para guardar esto precios es el mismo enum.

Podemos poner en el enum dos atributos, precioMinimo y precioMaximo de forma que esos valores indiquen en cada caso si es CARO, BARATO o MEDIO. Pondremos métodos getter a estos atributos y los rellenaremos en un constructor con dos parámetros. El código quedaría así

enum Precio {
    CARO(100, 1000), 
    MEDIO(10, 100), 
    BARATO(0, 10);

    private int precioMinimo;
    private int precioMaximo;

    private Precio(int minimo, int maximo) {
        precioMinimo = minimo;
        precioMaximo = maximo;
    }

    public int getPrecioMaximo() {
        return precioMaximo;
    }

    public int getPrecioMinimo() {
        return precioMinimo;
    }
}

Fijémonos en varios detalles

  • El constructor debe ser obligatoriamente privado, si no, da error al compilar. Esto quiere decir que no podremos hacer directamente un new de este enum y debemos usar siempre las etiquetas CARO, BARATO y MEDIO definidas.
  • Las etiquetas llevan detrás, entre paréntesis, los parámetros que pasamos al constructor para cada una de ellas. De esta forma, quedan fijados los precios mínimo y máximo para cada una de ellas.

Y ya podemos hacer cosas como esta

Precio precio = Precio.CARO;
System.out.println ("un precio " + precio + " esta entre " + 
   precio.getPrecioMinimo() + " y " + 
   precio.getPrecioMaximo());

para obtener "un precio CARO esta entre 100 y 1000"