Menu
Coddy logo textTech

Enums e Métodos de Enum

Parte da seção Programação Orientada a Objetos do Journey de Java da Coddy — lição 50 de 87.

Um enum (enumeração) é um tipo de classe especial que representa um conjunto fixo de constantes. Em vez de usar inteiros ou strings arbitrários para representar opções como dias da semana ou status de pedidos, enums fornecem valores legíveis e com segurança de tipo (type-safe).

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.MONDAY;
System.out.println(today);  // Imprime: MONDAY

Enums são mais do que simples constantes — elas são classes completas. Você pode adicionar campos, construtores e métodos a elas:

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 vem com métodos integrados úteis. O método values() retorna um array de todas as constantes, enquanto valueOf() converte uma string para a constante enum correspondente. O método ordinal() retorna a posição da constante (começando em 0):

for (Day d : Day.values()) {
    System.out.println(d + " is at position " + d.ordinal());
}

Day day = Day.valueOf("FRIDAY");  // Converte string para enum

Enums são ideais quando você tem um conjunto fixo e conhecido de valores que não mudam em tempo de execução, tornando seu código mais seguro e expressivo do que usar constantes simples.

challenge icon

Desafio

Fácil

Vamos construir um sistema de pedidos de cafeteria que demonstra o poder dos enums com campos, construtores e métodos. Você criará um enum CoffeeSize que armazena informações de preços e um sistema para processar pedidos de clientes.

Você organizará seu código em três arquivos:

  • CoffeeSize.java: Crie um enum representando os tamanhos de café com preços associados. Seu enum deve ter três constantes: SMALL, MEDIUM e LARGE com preços de 2.50, 3.50 e 4.50 respectivamente.

    Cada tamanho precisa de um campo privado price (double), um construtor para defini-lo e um método getPrice() para recuperá-lo. Adicione também um método getDescription() que retorna uma string no formato: [size name] - $[price] (por exemplo: SMALL - $2.5)

  • Order.java: Crie uma classe representando um pedido de café. Um Order possui dois campos privados: customerName (String) e size (CoffeeSize). Inclua um construtor para inicializar ambos os campos e métodos getter para cada um.

    Adicione um método getReceipt() que retorna uma string de várias linhas:

    Order for: [customerName]
    Size: [size description from getDescription()]
    Total: $[price from the size]
  • Main.java: Dê vida à sua cafeteria! Você receberá duas entradas: um nome de cliente (String) e um nome de tamanho (String como "SMALL", "MEDIUM" ou "LARGE").

    Primeiro, use CoffeeSize.valueOf() para converter a string do tamanho na constante enum correspondente. Crie um Order com o nome do cliente e o tamanho, e então imprima o recibo.

    Após imprimir o recibo, imprima uma linha vazia e, em seguida, exiba o menu completo iterando por todos os valores de CoffeeSize usando o método values(). Para cada tamanho, imprima sua descrição em uma linha separada.

Você receberá duas entradas em ordem: o nome do cliente e o nome do tamanho (um entre "SMALL", "MEDIUM" ou "LARGE").

Observe como o enum encapsula tanto a identidade do tamanho quanto seu preço associado — muito mais limpo do que usar constantes separadas ou números mágicos em todo o seu código!

Folha de consulta

Um enum é um tipo especial de classe que representa um conjunto fixo de constantes, fornecendo valores legíveis e seguros quanto ao tipo (type-safe):

enum Day {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

Day today = Day.MONDAY;
System.out.println(today);  // Imprime: MONDAY

Enums podem ter campos, construtores e 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

Métodos integrados de enum:

  • values() - retorna um array de todas as constantes do enum
  • valueOf(String) - converte uma string para a constante enum correspondente
  • ordinal() - retorna a posição da constante (começando em 0)
for (Day d : Day.values()) {
    System.out.println(d + " is at position " + d.ordinal());
}

Day day = Day.valueOf("FRIDAY");  // Converte string para enum

Experimente você mesmo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Ler entradas
        String customerName = scanner.nextLine();
        String sizeName = scanner.nextLine();
        
        // TODO: Converter sizeName para o enum CoffeeSize usando valueOf()
        
        // TODO: Criar um Pedido (Order) com o nome do cliente e o tamanho
        
        // TODO: Imprimir o recibo
        
        // TODO: Imprimir uma linha vazia
        
        // TODO: Exibir o menu completo iterando por todos os valores de CoffeeSize
        // Dica: Use CoffeeSize.values() para obter todas as constantes do enum
        
    }
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos