====== 10 - Enumerados ====== 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 [[https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Enum.html|enums]]. Además, el ámbito de los constructores debe ser //private// o de //paquete//. ===== Creación de enumerados ===== 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. ===== Uso de los enumerados ===== 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 ===== Enumerados con constructor ===== ¿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. ===== Ejercicios ===== ** Ejercicio 1 ** Modifica la clase //Computer// de los ejercicios del tema anterior para que el disco duro sea un enumerado con los siguientes valores: * HDD_NOR * HDD_NAND * SDD_25 * SDD_M2 ** Ejercicio 2 ** Haz lo mismo con las CPUs (mediante enumerados) con los siguientes tipos: * PENTIUM_GOLD_G7400 * RYZEN_3_4100 * CORE_I5_12400F * RYZEN_7_5800X * CORE_I7_12700KF ** Ejercicio 3 ** Añade la velocidad del procesador como una nueva propiedad del enumerado CPU: * PENTIUM_GOLD_G7400: 3.7 GHz * RYZEN_3_4100: 3.8 GHz * CORE_I5_12400F: 2.1 GHz * RYZEN_7_5800X: 3.8 GHz * CORE_I7_12700KF: 3.8 GHz 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: * PENTIUM_GOLD_G7400: 2/4 * RYZEN_3_4100: 4/8 * CORE_I5_12400F: 6/12 * RYZEN_7_5800X: 8/16 * CORE_I7_12700KF: 12/20