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.