Enumerados en java
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"