DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 37: Use EnumMap em vez da indexação ordinal

1. Introdução

  • Código que usa o método ordinal para indexar um array ou lista.

2. Problema com o uso de ordinais

  • Código de exemplo com array indexado pelo ordinal do ciclo de vida de uma planta.
  • Arrays não são compatíveis com genéricos, resultando em cast não verificado.
  • Necessidade de rotulação manual da saída.
  • Perigo de usar valores int incorretos, levando a erros silenciosos ou exceções. Image description

Image description

3. Solução com EnumMap

  • EnumMap como uma alternativa mais eficiente e segura.
  • Programa reescrito utilizando EnumMap.
  • Benefícios: código mais curto, claro, seguro e sem necessidade de rotulação manual.

4. Detalhes sobre EnumMap

  • EnumMap utiliza um array internamente, combinando a segurança de Map com a rapidez de um array.
  • Construtor de EnumMap requer um objeto Class do tipo da chave (token de tipo limitado). Image description

5. Uso de streams com EnumMap

  • Programa usando streams para gerenciar o map.
  • Problema: implementação de map escolhida pelo stream pode não ser uma EnumMap.
  • Solução: uso da forma de três parâmetros do Collectors.groupingBy para especificar a implementação de map.

6. Comparação de comportamentos

  • Diferenças de comportamento entre versões com EnumMap e baseadas em stream.
  • EnumMap sempre cria um map aninhado, enquanto streams criam apenas se necessário.

7. Caso de uso avançado: mapeamento de dois valores enum

  • Exemplo de array de arrays indexados por ordinais para transições de fases.
  • Problemas semelhantes: risco de erro na tabela de transição, manutenção difícil. Image description

8. Solução avançada com EnumMap

  • Uso de EnumMap para mapear transições de fases.
  • como tipo do map.
  • Inicialização do map com coletores encadeados.
  • Image description

Image description

Image description

9. Adição de novas fases

  • Adicionar novas fases ao sistema com EnumMap é simples e seguro.
  • Comparação com a complexidade de atualização de arrays.

10. Cuidados com valores nulos

  • Uso de null para indicar ausência de mudança de estado é arriscado.
  • Necessidade de uma solução limpa para evitar NullPointerException.

11. Conclusão

  • Raramente adequado utilizar ordinais para indexar arrays.
  • Preferência pelo uso de EnumMap, especialmente para relacionamentos multidimensionais.

Resumo Final

  • Não use ordinais para indexar arrays.
  • Prefira EnumMap para segurança, clareza e facilidade de manutenção.
  • Considere EnumMap<..., EnumMap<...>> para relacionamentos multidimensionais.

Top comments (0)