DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

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.

Image description

Image description

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>.

Image description

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.

Top comments (0)