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!
Prué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 IteratorPractica por tu cuenta: Compilador de Java online