Enums y métodos de Enum
Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy — lección 50 de 87.
Un enum (enumeración) es un tipo de clase especial que representa un conjunto fijo de constantes. En lugar de utilizar enteros o cadenas arbitrarios para representar opciones como los días de la semana o los estados de un pedido, los enums proporcionan valores legibles y con seguridad de tipos.
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // Imprime: MONDAYLos enums son más que simples constantes: son clases completas. Puedes añadirles campos, constructores y métodos:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // Imprime: 20Cada enum incluye métodos integrados útiles. El método values() devuelve un array de todas las constantes, mientras que valueOf() convierte una cadena a la constante de enum correspondiente. El método ordinal() devuelve la posición de la constante (empezando desde 0):
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // Convierte una cadena a enumLos enums son ideales cuando tienes un conjunto conocido y fijo de valores que no cambiarán en tiempo de ejecución, lo que hace que tu código sea más seguro y expresivo que usar constantes simples.
Desafío
Fácil¡Vamos a construir un sistema de pedidos para una cafetería que demuestre el poder de los enums con campos, constructores y métodos! Crearás un enum CoffeeSize que almacena información de precios y un sistema para procesar los pedidos de los clientes.
Organizarás tu código en tres archivos:
CoffeeSize.java: Crea un enum que represente los tamaños de café con sus precios asociados. Tu enum debe tener tres constantes:SMALL,MEDIUMyLARGEcon precios de2.50,3.50y4.50respectivamente.Cada tamaño necesita un campo privado
price(double), un constructor para establecerlo y un métodogetPrice()para obtenerlo. También añade un métodogetDescription()que devuelva una cadena con el formato:[size name] - $[price](por ejemplo:SMALL - $2.5)Order.java: Crea una clase que represente un pedido de café. Un Order tiene dos campos privados:customerName(String) ysize(CoffeeSize). Incluye un constructor para inicializar ambos campos y métodos getter para cada uno.Añade un método
getReceipt()que devuelva una cadena multilínea:Order for: [customerName] Size: [size description from getDescription()] Total: $[price from the size]Main.java: ¡Dale vida a tu cafetería! Recibirás dos entradas: un nombre de cliente (String) y un nombre de tamaño (String como "SMALL", "MEDIUM" o "LARGE").Primero, usa
CoffeeSize.valueOf()para convertir la cadena del tamaño en la constante del enum correspondiente. Crea un Order con el nombre del cliente y el tamaño, luego imprime el recibo.Después de imprimir el recibo, imprime una línea vacía, luego muestra el menú completo iterando a través de todos los valores de
CoffeeSizeusando el métodovalues(). Para cada tamaño, imprime su descripción en una línea separada.
Recibirás dos entradas en orden: el nombre del cliente y el nombre del tamaño (uno de "SMALL", "MEDIUM" o "LARGE").
¡Observa cómo el enum encapsula tanto la identidad del tamaño como su precio asociado, mucho más limpio que usar constantes separadas o números mágicos en todo tu código!
Hoja de referencia
Un enum es un tipo de clase especial que representa un conjunto fijo de constantes, proporcionando valores legibles y con seguridad de tipos:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Day today = Day.MONDAY;
System.out.println(today); // Prints: MONDAYLos enums pueden tener campos, constructores y métodos:
enum Size {
SMALL(10), MEDIUM(20), LARGE(30);
private int price;
Size(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
System.out.println(Size.MEDIUM.getPrice()); // Prints: 20Métodos integrados de los enum:
values()- devuelve un array con todas las constantes del enumvalueOf(String)- convierte una cadena de texto en la constante del enum correspondienteordinal()- devuelve la posición de la constante (empezando desde 0)
for (Day d : Day.values()) {
System.out.println(d + " is at position " + d.ordinal());
}
Day day = Day.valueOf("FRIDAY"); // Converts string to enumPruébalo tú mismo
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leer entradas
String customerName = scanner.nextLine();
String sizeName = scanner.nextLine();
// TODO: Convertir sizeName al enum CoffeeSize usando valueOf()
// TODO: Crear una Order con el nombre del cliente y el tamaño
// TODO: Imprimir el recibo
// TODO: Imprimir una línea vacía
// TODO: Mostrar el menú completo iterando a través de todos los valores de CoffeeSize
// Hint: Usar CoffeeSize.values() para obtener todas las constantes del enum
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosIntroducción a la OOPClases vs. ObjetosLa palabra clave thisMétodosCampos (Atributos)Método constructorSobrecarga de constructoresResumen - Calculadora simple4Herencia
Herencia básica (extends)La palabra clave superSobrescritura de métodos (@Override)Encadenamiento de constructoresLa clase ObjectHerencia simple y multinivelPor qué no hay herencia múltiple de clasesResumen - Jerarquía de empleados7Métodos especiales y la clase Object
Método toString()equals() y hashCode()Método clone()compareTo() y ComparableInterfaz ComparatorResumen - Ordenamiento personalizado2Modificadores de acceso y encapsulamiento
Visión general de los niveles de accesoMétodos Getter y SetterOcultamiento de informaciónLa palabra clave finalResumen - Gestor de cuentas bancarias5Polimorfismo
Fundamentos de sobrecarga de métodosSobrescritura de métodos (tiempo de ejecución)Upcasting y DowncastingEl operador instanceofClases y métodos abstractosResumen - Calculadora de figuras8Conceptos avanzados de POO
Composición vs. HerenciaAgregación vs. ComposiciónClases internas, anidadas y anónimasEnums y métodos de EnumRecords (Java 16+)Clases selladas (Java 17+)11Patrones de diseño - Parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón BuilderPatrón ObserverPatrón Strategy3Propiedades de clase y miembros estáticos
Variables de instancia vs. estáticasMétodos estáticosBloques estáticosConstantes (static final)Repaso - Contador y utilidad6Interfaces y Clases Abstractas
Introducción a las InterfacesImplementación de InterfacesImplementación de Múltiples InterfacesMétodos Default y Static en InterfacesClases Abstractas vs InterfacesInterfaces FuncionalesResumen - Sistema de Pagos9Genéricos
Introducción a los genéricosClases genéricasMétodos genéricosParámetros de tipo delimitadosComodines (?, extends, super)Resumen - Contenedor genérico12Patrones de diseño Parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón CompositePatrón Iterator