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 especial de classe 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, os enums fornecem valores legíveis e seguros quanto ao tipo.
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: 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: 20Todo enum vem com métodos integrados úteis. O método values() retorna um array de todas as constants, enquanto valueOf() converte uma string na enum correspondente. O método ordinal() retorna a posição da constant (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 conhecido e fixo de valores que não mudará em tempo de execução, tornando seu código mais seguro e expressivo do que usar constantes simples.
Desafio
FácilVamos criar um sistema de pedidos de uma cafeteria que demonstra o poder de 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 que represente os tamanhos de café com seus respectivos preços. Seu enum deve ter três constantes:SMALL,MEDIUMeLARGE, com preços de2.50,3.50e4.50, respectivamente.Cada tamanho precisa de um campo privado
price(double), um construtor para defini-lo e um métodogetPrice()para obtê-lo. Adicione também um métodogetDescription()que retorne uma string no formato:[size name] - $[price](por exemplo:SMALL - $2.5)Order.java: Crie uma classe que represente um pedido de café. Um Order tem 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 retorne uma string com 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 de enum correspondente. Crie um Order com o nome do cliente e o tamanho e, em seguida, imprima o recibo.Depois de imprimir o recibo, imprima uma linha vazia e, então, 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 na ordem: nome do cliente e nome do tamanho (um entre "SMALL", "MEDIUM" ou "LARGE").
Observe como o enum encapsula tanto a identidade do tamanho quanto seu preço associado, de forma muito mais organizada do que usar constantes separadas ou números mágicos em todo o código!
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: Converta sizeName para o enum CoffeeSize usando valueOf()
// TODO: Crie um Order com o nome do cliente e o tamanho
// TODO: Imprima o recibo
// TODO: Imprima uma linha vazia
// TODO: Exiba 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 IteratorPratique por conta própria: Compilador de Java online