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: MONDAYEnums 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: 20Cada 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 enumEnums 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.
Desafio
FácilVamos 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,MEDIUMeLARGEcom preços de2.50,3.50e4.50respectivamente.Cada tamanho precisa de um campo privado
price(double), um construtor para defini-lo e um métodogetPrice()para recuperá-lo. Adicione também um métodogetDescription()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) esize(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
CoffeeSizeusando o métodovalues(). 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: MONDAYEnums 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: 20Métodos integrados de enum:
values()- retorna um array de todas as constantes do enumvalueOf(String)- converte uma string para a constante enum correspondenteordinal()- 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 enumExperimente 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
}
}
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
1Fundamentos de POO
Arquivos ExternosIntrodução à POOClasses vs ObjetosA Palavra-chave thisMétodosCampos (Atributos)Método ConstrutorSobrecarga de ConstrutorRecapitulação - Calculadora Simples4Herança
Herança Básica (extends)A Palavra-chave superSobrescrita de Método (@Override)Encadeamento de ConstrutoresA Classe ObjectHerança Simples e MultinívelPor que não há Herança Múltipla de ClassesRecapitulação - Hierarquia de Funcionários7Métodos Especiais e a Classe Object
Método toString()equals() e hashCode()Método clone()compareTo() e ComparableInterface ComparatorRecapitulação - Ordenação Personalizada2Modificadores de Acesso e Encapsulamento
Visão Geral dos Níveis de AcessoMétodos Getter e SetterOcultação de InformaçõesA Palavra-chave finalRecapitulação - Gerenciador de Conta Bancária5Polimorfismo
Fundamentos de Sobrecarga de MétodosSobrescrita de Métodos (Tempo de Execução)Upcasting e DowncastingO Operador instanceofClasses e Métodos AbstratosRecapitulação - Calculadora de Formas8Conceitos Avançados de OOP
Composição vs HerançaAgregação vs ComposiçãoClasses Internas, Aninhadas e AnônimasEnums e Métodos de EnumRecords (Java 16+)Classes Seladas (Java 17+)11Padrões de Projeto Parte 1
Introdução aos Padrões de ProjetoPadrão SingletonPadrão FactoryPadrão BuilderPadrão ObserverPadrão Strategy3Propriedades de Classe e Membros Estáticos
Variáveis de Instância vs EstáticasMétodos EstáticosBlocos EstáticosConstantes (static final)Recapitulação - Contador e Utilitário6Interfaces e Classes Abstratas
Introdução às InterfacesImplementando InterfacesImplementação de Múltiplas InterfacesDefault e Static em InterfacesClasses Abstratas vs InterfacesInterfaces FuncionaisRecapitulação - Sistema de Pagamento9Generics
Introdução a GenericsClasses GenéricasMétodos GenéricosParâmetros de Tipos DelimitadosWildcards (?, extends, super)Recapitulação - Container Genérico12Padrões de Projeto Parte 2
Padrão CommandPadrão AdapterPadrão DecoratorPadrão Template MethodPadrão StatePadrão CompositePadrão Iterator