Item 36: Use a classe EnumSet em vez dos campos de bits
Java Efetivo (livro)
Posted on June 20, 2024
1. Uso Tradicional de Campos de Bits:
Enumeração com Potências de 2:
Cada constante enum é atribuída a uma potência de 2.
Combinação de Constantes: Utiliza-se a operação bitwise OR para combinar constantes.Operações de Conjunto:
União e interseção são feitas eficientemente com aritmética bitwise.
2. Desvantagens dos Campos de Bits:
Interpretação Difícil:
Campos de bits são mais difíceis de interpretar do que constantes enum int.Iteração Complexa:
Não há um modo fácil de iterar sobre os elementos de um campo de bits.Limitação de Tamanho:
Precisa-se prever o número máximo de bits necessários ao criar a API, limitando a 32 (int) ou 64 bits (long).
3. Alternativa Melhor - EnumSet:
Representação Eficiente:
java.util.EnumSet representa conjuntos de valores retirados de um único tipo enum.Interface Set:
EnumSet implementa a interface Set, oferecendo segurança de tipo e interoperabilidade.Desempenho Comparável:
Para enums com até 64 elementos, EnumSet é representada com um único long.Operações de Conjunto:
Métodos como removeAll e retainAll usam aritmética bitwise internamente.
4. Exemplo de Uso:
5. Vantagens do EnumSet:
Clareza e Concisão: Código é mais claro e conciso em comparação com campos de bits.
Segurança e Facilidade:
Evita erros e a complexidade do tratamento manual de bits.Flexibilidade:
Aceita qualquer implementação de Set, embora o uso principal seja EnumSet.
6. Desvantagem e Solução Temporária:
Imutabilidade:
Não é possível criar uma EnumSet imutável (até o Java 9).Solução Temporária:
Pode-se envolver EnumSet com Collections.unmodifiableSet, embora com perda de concisão e desempenho.
Conclusão:
Use EnumSet em vez de campos de bits para representar conjuntos de valores enum. EnumSet oferece um desempenho comparável, com maior clareza, segurança e facilidade de uso, evitando as limitações e complexidades associadas aos campos de bits.
Posted on June 20, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.