Los enumerados son una construcción del lenguaje introducida en la versión 5 de Java. Se trata de clases especiales que nos sirven para definir listas enumeradas de constantes. La única restricción que tiene los enumerados sobre las clases es que las enumeraciones no se pueden extender ya que implícitamente toda enumeración está extendiendo a la clase enums. Además, el ámbito de los constructores debe ser private o de paquete.
Para crear una enumeración lo hacemos casi igual que una clase, con la diferencia que utilizamos la palabra reservada enum:
public enum createEnum { }
Una vez creado, podemos ir añadiendo constantes a nuestra enumeración separadas por coma:
public enum createEnum { ENUM1, ENUM2, ENUM3 }
Por ejemplo, vamos a crear un enumerado con diferentes modelos de coches de la marca Kia:
public enum KiaModel { NIRO, XCEED, SPORTAGE }
A partir de ahora, ya podemos usar nuestro enum para limitar las opciones del modelo a la hora de crear coches en nuestro sistema.
Una vez tenemos creado nuestro enum, para usarlo es tan sencillo como hacer referencia al nombre de la clase y la constante que queramos usar. Por ejemplo, creamos una clase llamada Kia con el siguiente código:
public class Kia { KiaModel model; public Kia(KiaModel model) { this.model = model; } public KiaModel getmodel() { return model; } public String toString(){ return "Kia " + this.getmodel(); } }
Fíjate que el atributo model de nuestra clase es de tipo KiaModel (el enum que hemos creado antes) y no de tipo String. Ésto nos permite limitar los modelos de los coches a los que nosotros hemos definido. A parte de eso, la clase tiene el constructor donde le pasaremos el modelo, el getter del modelo y el método toString() para mostrar el objeto por pantalla.
Ahora, en nuestra clase principal tenemos que usar alguno de los valores del enum KiaModel cuando queramos crear un coche:
public class App { public static void main(String[] args) { Kia niro = new Kia(KiaModel.NIRO); Kia sportage = new Kia(KiaModel.SPORTAGE); Kia xceed = new Kia(KiaModel.XCEED); System.out.println(niro); System.out.println(sportage); System.out.println(xceed); } }
Kia NIRO Kia SPORTAGE Kia XCEED
¿Qué pasa si queremos añadir más atributos a nuestros enumerados? Para eso, podemos crear los atributos que queramos en la clase y un constructor privado donde le podemos pasar los valores adicionales que queramos. Además, en cada enumerado definiremos los atributo a la hora de crearlo.
Por ejemplo, vamos a añadir el tipo de motor a nuestros modelos:
public enum KiaModel { NIRO("1.6 GDi HEV 103kW"), XCEED("1.6 TGDi 112kW"), SPORTAGE("1.0 T-GDi 88kW"); private String engine; private KiaModel(String engine) { this.engine = engine; } public String getEngine(){ return this.engine; } }
En nuestra clase Kia podemos acceder al atributo recién creado con su método correspondiente (getEngine()):
public class Kia { KiaModel model; public Kia(KiaModel model) { this.model = model; } public KiaModel getmodel() { return model; } public String toString(){ return "Kia " + this.getmodel() + " - Motor: " + this.getmodel().getEngine(); } }
public class App { public static void main(String[] args) { Kia niro = new Kia(KiaModel.NIRO); Kia sportage = new Kia(KiaModel.SPORTAGE); Kia xceed = new Kia(KiaModel.XCEED); System.out.println(niro); System.out.println(sportage); System.out.println(xceed); } }
Kia NIRO - Motor: 1.6 GDi HEV 103kW Kia SPORTAGE - Motor: 1.0 T-GDi 88kW Kia XCEED - Motor: 1.6 TGDi 112kW
De esta forma, podemos agregar tantos atributos como queramos a nuestros enumerados para ampliar su funcionalidad.
Ejercicio 1
Modifica la clase Computer de los ejercicios del tema anterior para que el disco duro sea un enumerado con los siguientes valores:
Ejercicio 2
Haz lo mismo con las CPUs (mediante enumerados) con los siguientes tipos:
Ejercicio 3
Añade la velocidad del procesador como una nueva propiedad del enumerado CPU:
En el método toString() de CPU deberá mostrarse tanto el tipo de procesador como su velocidad.
Ejercicio 4
Añade también el número de hilos a las CPUs como propiedad: