Menu
Coddy logo textTech

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: MONDAY

Los 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: 20

Cada 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 enum

Los 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.

challenge icon

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, MEDIUM y LARGE con precios de 2.50, 3.50 y 4.50 respectivamente.

    Cada tamaño necesita un campo privado price (double), un constructor para establecerlo y un método getPrice() para obtenerlo. También añade un método getDescription() 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) y size (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 CoffeeSize usando el método values(). 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: MONDAY

Los 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: 20

Métodos integrados de los enum:

  • values() - devuelve un array con todas las constantes del enum
  • valueOf(String) - convierte una cadena de texto en la constante del enum correspondiente
  • 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");  // Converts string to enum

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
        
    }
}
quiz iconPonte a prueba

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