Google Collections Library

by Ruben Badaró on 29 Outubro, 2007

in java

Não sei como só vi isto agora mas já está disponível há algum tempo, embora ainda em 0.5 (Alpha).
Trata-se uma biblioteca desenvolvida internamente por pessoal do Google e disponibilizada ao público em geral com uma licença opensource. Pretende ser uma extensão às Java collections, e as colecções estendem os tipos base das colecções.

Novas Collections

São definidos, os seguintes novos tipos de colecções:

  • BiMap
  • Esta interface estende Map e permite ter um Map bidireccional, ou seja, em que é possível aceder por chave e/ou por valor. São fornecidas três implementações: HashBiMap, EnumBiMap e HashEnumBiMap.
    O HashBiMap contém dois HashMaps e permite a utilização de chaves e valores null. O EnumBiMap utiliza dois EnumMaps na sua implementação mas não permite chaves e valores null. O HashEnumBiMap é um misto, sendo que utiliza um EnumMap para mapear chaves para valores e um HashMap para mapear valores para chaves.

  • Multimap
  • É uma Map que pode ter vários valores para cada chave, ou seja, pode-se fazer algo como

    myMultimap.put(chavexpto,valorA);
    

    As vezes que quisermos, com a mesma chave. Existem dois interfaces principais que extendem Multimap: ListMultimap e SetMultimap.
    O ListMultimap guarda internamente os valores para uma chave numa lista ordenada, preservando assim ordem de inserção. São fornecidas as implementações ArrayListMultimap e LinkedListMultimap.
    O SetMultimap utiliza um Set para guardar os valores de cada chave e por isso não permite pares (chave,valor) repetido. São fornecidas as implementações HashMultimap, LinkedHashMultimap e TreeMultimap. Os nomes penso que são intuitivos :)

  • Multiset
  • É simplesmente um Set que permite duplicados, comummente chamado de Bag.
    Cada elemento tem um número de ocorrências, sendo que a noção de vários elementos com o mesmo valor não tem lógica, mas sim um elemento com X ocorrências. O número de ocorrências de um elemento é alterado quando o mesmo valor é inserido várias vezes e a igualidade entre valores é dependente da classe implementadora do Multiset (e.g. um HashMultiset poderá simplesmente comparar hashcodes, outro poderá ter uma aproximação diferente). Para oferecer esta noção de ocorrência, é fornecido o método

    int count(Object);
    

    São fornecidas as implementações EnumMultiset, HashMultiset, LinkedHashMultiset e TreeMultiset.

Além destas, existem mais classes de colecções derivadas, que estendem algumas das que aqui falei.

Classes Auxiliares

São fornecidas inúmeras classes auxiliares, mais do que as que consigo enumerar aqui e a maioria ainda nem olhei para elas.
Posso destacar alguns helpers, como seja por exemplo os Builders para criar colecções imutáveis de Multimap e BiMap ou um muito útil AbstractIterator, para facilitar a implementação de Iterators.
São fornecidas também Forward Collections, que são colecções que delegam o processamento dos seus métodos nos métodos de uma classe filha. Isto é útil porque a maioria das classes fornecidas pelo google collections library são final e esta é a forma de adicionar comportamento personalizado. O pattern usado nestas forward collections é o decorator.

Base Google Goodies :)

Além das colecções e classes auxiliares relacionadas, são incluídas e utilizadas classes base e utilitárias google. São coisas simples e algumas delas bem pensadas e que podem ser utilizadas no dia-a-dia. Destaco a classe Preconditions: um conjunto de métodos estáticos para serem usados no início de métodos, para verificar pré-condições de argumentos e verificações de estado interno. Existem soluções de contratos mais completas obviamente mas como solução leve e prática é bastante usável.

Por fim, o mais importante, vão ao site do Google Collections Library, saquem o snapshot e vejam por vocês próprios. Poderá vir a ser uma boa adição aos nossos projectos.

Leave a Comment

{ 1 trackback }

Previous post:

Next post: