DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on • Edited on

Item 33: Pense na possibilidade de usar contêineres heterogêneos typesafe

Usos Comuns dos Genéricos

  • Coleções como Set e Map.
  • Contêineres de elemento único como ThreadLocal< T > e AtomicReference< T >.
  • Limitação: fixar número de parâmetros de tipo por contêiner.

Necessidade de Flexibilidade

  • Exemplo: linha de banco de dados com muitas colunas.
  • Solução: parametrizar a chave em vez do contêiner.

Exemplo de Implementação: Classe Favorites
Permite armazenar e recuperar instâncias favoritas de muitos tipos.
Utiliza objetos da classe Class como chave.
Class permite comunicação de informações em tempo de compilação e execução.

API da Classe Favorites

  • Cliente apresenta um objeto Class para configurar e recuperar favoritos.
  • Exemplo de uso: Image description

Implementação da Classe Favorites

  • Utiliza Map < Class<?>, Object> para armazenar favoritos.
  • putFavorite insere o objeto favorito no mapa.
  • getFavorite recupera e faz cast dinâmico para o tipo correto usando Class.cast.

Limitações da Classe Favorites

  • Segurança de tipos pode ser corrompida por clientes maliciosos usando Class bruto.
  • Não pode ser usada com tipos não reificados (ex: List).
  • putFavorite pode verificar instâncias para assegurar segurança: Image description

Wrappers de Coleção Typesafe

  • java.util.Collections oferece wrappers como checkedSet, checkedList, checkedMap.
  • Adicionam reificação às coleções, lançando ClassCastException em inserções incorretas.

Tokens de Tipo Limitados

  • Exemplo: método getAnnotation na interface AnnotatedElement.
  • Utiliza Class<? extends Annotation> como token de tipo limitado.
  • Class.asSubclass realiza cast seguro dinamicamente.

Resumo Final

  • Contêineres genéricos normalmente têm número fixo de parâmetros de tipo.
  • Contêineres heterogêneos typesafe usam parâmetros de tipo nas chaves.
  • Objetos Class podem ser usados como tokens de tipo.
  • Tokens de tipo personalizados também podem ser usados, como DatabaseRow e Column.

Top comments (0)