Item 38: Emule enums extensíveis por meio de interfaces

Item 38: Emule enums extensíveis por meio de interfaces

Enums em Java:

Enums são preferíveis aos padrões enum typesafe (descritos na primeira edição do livro).
A exceção é a extensibilidade, que era possível no padrão original, mas não é suportada pelas enums em Java.

Extensibilidade de Enums:

Extensibilidade de enums geralmente é uma má ideia:
Confusão entre elementos de tipos estendidos e tipos base.
Dificuldade em enumerar todos os elementos de tipos base e suas extensões.
Complica o design e implementação.

Uso de Enums Extensíveis:

Útil em casos como códigos de operação (opcodes).
Permite que usuários da API forneçam suas próprias operações.

Solução com Interfaces:

Enums podem implementar interfaces arbitrárias.
Defina uma interface para o tipo de opcode e um enum que implemente essa interface.

Exemplo:

Operation (interface) e BasicOperation (enum) do Item 34.
Criação de um enum que implemente a interface Operation.

Uso na API:

Utilize o tipo da interface (Operation) nas APIs.
Pode definir e usar enums estendidos que implementem a interface.

Implementação:

Passar o literal de classe (ExtendedOperation.class) ou uma Collection<? extends Operation>.

Limitações e Soluções:

Implementações não podem ser herdadas de um tipo enum para outro.
Pode duplicar código ou usar métodos auxiliares estáticos para evitar duplicação.

Exemplo na Biblioteca Java:

Tipo enum java.nio.file.LinkOption implementa as interfaces CopyOption e OpenOption.

Resumo:

Emule enums extensíveis escrevendo uma interface para acompanhar um tipo enum base que implemente a interface.
Clientes podem escrever seus próprios enums ou tipos que implementem a interface.
Instâncias desses tipos podem ser usadas onde as instâncias do tipo enum base são usadas, desde que as APIs sejam escritas em termos da interface.