Médio Java

Switch com enum e EnumMap

Enunciado

Crie um enum StatusPedido com PENDENTE, PROCESSANDO, ENVIADO e ENTREGUE. Use um switch com seta para imprimir uma mensagem para cada status. Depois, crie um EnumMap<StatusPedido, Integer> que conta quantos pedidos existem em cada status, preencha com valores e imprima o total por status.

Requisitos

  • O enum deve ter pelo menos 4 constantes.
  • O switch deve usar a sintaxe de seta (->) e cobrir todos os casos.
  • O EnumMap deve ser criado com new EnumMap<>(StatusPedido.class) e populado com put.
  • O programa deve imprimir a contagem para cada status usando values().

Código inicial

import java.util.EnumMap;

public class ExercicioEnumMap {
    enum StatusPedido {
        PENDENTE, PROCESSANDO, ENVIADO, ENTREGUE
    }

    public static void main(String[] args) {
        // TODO: switch com mensagens
        // TODO: EnumMap com contagens
    }
}

Saída esperada

PENDENTE: Aguardando pagamento
PROCESSANDO: Em separação
ENVIADO: A caminho
ENTREGUE: Finalizado
PENDENTE: 3
PROCESSANDO: 2
ENVIADO: 1
ENTREGUE: 4
Ver dica

No switch, use case PENDENTE -> System.out.println(...). Para o EnumMap, crie com new EnumMap<>(StatusPedido.class) e use put para cada chave. Para imprimir, percorra StatusPedido.values() e use map.getOrDefault(s, 0).

Mostrar solução
import java.util.EnumMap;

public class ExercicioEnumMap {
    enum StatusPedido {
        PENDENTE, PROCESSANDO, ENVIADO, ENTREGUE
    }

    public static void main(String[] args) {
        // Switch com seta: imprime mensagem para cada status
        for (StatusPedido s : StatusPedido.values()) {
            switch (s) {
                case PENDENTE -> System.out.println("PENDENTE: Aguardando pagamento");
                case PROCESSANDO -> System.out.println("PROCESSANDO: Em separação");
                case ENVIADO -> System.out.println("ENVIADO: A caminho");
                case ENTREGUE -> System.out.println("ENTREGUE: Finalizado");
            }
        }

        // EnumMap: contagem de pedidos por status
        EnumMap<StatusPedido, Integer> contagem = new EnumMap<>(StatusPedido.class);
        contagem.put(StatusPedido.PENDENTE, 3);
        contagem.put(StatusPedido.PROCESSANDO, 2);
        contagem.put(StatusPedido.ENVIADO, 1);
        contagem.put(StatusPedido.ENTREGUE, 4);

        for (StatusPedido s : StatusPedido.values()) {
            System.out.println(s + ": " + contagem.getOrDefault(s, 0));
        }
    }
}

Passo a passo

  1. Declaramos o enum StatusPedido com quatro constantes.
  2. No main, iteramos sobre StatusPedido.values() para percorrer todos os status.
  3. Dentro do loop, um switch com seta imprime a mensagem correspondente a cada status.
  4. Criamos um EnumMap com chave StatusPedido e valor Integer.
  5. Populamos o mapa com put, associando cada status a uma contagem.
  6. Novamente percorremos values() para imprimir cada status e sua contagem, usando getOrDefault para evitar null.

Por que funciona

O switch com enum é exaustivo e o compilador garante que todos os casos são tratados (ou exige default). A sintaxe de seta elimina o fall-through acidental. O EnumMap é internamente um array indexado pelo ordinal() da constante, o que o torna muito eficiente e mantém a ordem natural do enum.

Erros comuns

  • Esquecer de tratar todos os casos no switch sem default: o compilador pode emitir aviso, mas se usar seta e não cobrir tudo, dá erro.
  • Criar EnumMap sem passar a classe: new EnumMap<>() não compila; é preciso new EnumMap<>(StatusPedido.class).
  • Usar get sem verificar null: se a chave não existir, retorna null e pode causar NullPointerException ao fazer operações. Prefira getOrDefault.

Outra forma de resolver

Se a contagem viesse de uma lista de pedidos, poderíamos usar contagem.merge(status, 1, Integer::sum). Para o switch, uma alternativa é usar if-else, mas perde a clareza e a verificação de exhaustividade.

Saída esperada

PENDENTE: Aguardando pagamento
PROCESSANDO: Em separação
ENVIADO: A caminho
ENTREGUE: Finalizado
PENDENTE: 3
PROCESSANDO: 2
ENVIADO: 1
ENTREGUE: 4