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
switchdeve usar a sintaxe de seta (->) e cobrir todos os casos. - O
EnumMapdeve ser criado comnew EnumMap<>(StatusPedido.class)e populado comput. - 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
- Declaramos o enum
StatusPedidocom quatro constantes. - No
main, iteramos sobreStatusPedido.values()para percorrer todos os status. - Dentro do loop, um
switchcom seta imprime a mensagem correspondente a cada status. - Criamos um
EnumMapcom chaveStatusPedidoe valorInteger. - Populamos o mapa com
put, associando cada status a uma contagem. - Novamente percorremos
values()para imprimir cada status e sua contagem, usandogetOrDefaultpara evitarnull.
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
switchsemdefault: o compilador pode emitir aviso, mas se usar seta e não cobrir tudo, dá erro. - Criar
EnumMapsem passar a classe:new EnumMap<>()não compila; é precisonew EnumMap<>(StatusPedido.class). - Usar
getsem verificarnull: se a chave não existir, retornanulle pode causarNullPointerExceptionao fazer operações. PrefiragetOrDefault.
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