Atenção: esse artigo tem um vídeo complementar. Clique e assista!
O artigo apresenta as coleções e utilitários introduzidos pela nova biblioteca desenvolvida pela Google, a Google Collections Library, utilizada em grandes projetos amplamente conhecidos nos dias atuais, como o GMail e o Google Reader.
Para que serve:
Com as novas coleções da Google Collections Library é possível que o desenvolvedor Java resolva diversos problemas comuns do dia-a-dia de forma simples e eficiente.
Em que situação o tema é útil:
A biblioteca pode ser útil nas situações em que é preciso criar coleções imutáveis, criar mapas com coleções como valor, criar sets que permitem valores repetidos, contar elementos iguais em uma coleção, filtrar elementos, transformar elementos, validar e ordenar coleções, buscar elementos em uma coleção, além de outras situações descritas no artigo.
Google Collections:
A Google Collections Library é uma biblioteca criada pela Google que oferece novas coleções e utilitários para facilitar e enriquecer a manipulação de coleções em Java. As novas coleções complementam e estendem as coleções que já fazem parte da linguagem Java, são 100% compatíveis com as interfaces especificadas no JDK e suportam generics. As principais coleções são: as coleções imutáveis, que oferecem performance e menos verbosidade que coleções não modificáveis; os Multisets, que são Sets que permitem elementos duplicados; e os Multimaps, que são Maps que possuem coleções como valor. Além disso, diversos métodos utilitários para realizar operações como filtragem, transformação, ordenação e buscas são oferecidos.
A Google Collections Library é uma biblioteca desenvolvida pela Google que oferece um conjunto de novos tipos de coleções, novas implementações e ferramentas que facilitam manipulá-las. Segundo seus autores, a biblioteca é amplamente utilizada em grandes projetos, como por exemplo, GMail, Blogger, Google Reader, Docs, AdWords, AdSense e dezenas de outros. A Google Collections é uma extensão natural do Java Collections Framework, que faz parte do Java Development Kit (JDK) e suporta Java 5 ou superior.
O Java Collections Framework foi desenvolvido em 1997 por Joshua Block, que atualmente trabalha para a Google, junto com os responsáveis pelo projeto Google Collections: Kevin Bourrillion e Jared Levy. Esse projeto está hospedado no Google Code (http://google-collections.googlecode.com) sob a licença Apache v 2.0.
A biblioteca ainda não alcançou sua versão final e no momento da escrita desse artigo está na versão Release Candidate 2, o que significa que pode sofrer pequenas alterações. É provável que quando você receber esta edição a versão final já tenha sido lançada.
Em virtude da necessidade de utilizar coleções mais poderosas do que as coleções do JDK em suas aplicações, a Google deu início ao desenvolvimento do projeto. O Apache Commons Collections é outro projeto que também foi desenvolvido por essa mesma necessidade, porém, segundo Kevin, a Google optou por desenvolver sua própria biblioteca devido ao fato das coleções da Apache não suportarem Generics e não respeitarem os contratos especificados pelas interfaces da JDK.
As coleções da Google oferecem uma série de novos recursos para tornar o desenvolvimento Java muito mais simples e eficiente, entre eles: Coleções Imutáveis, Multimaps, Multisets, Mapas de Diferença e métodos utilitários para instanciação, filtragem e transformação são exemplos de algumas das principais funcionalidades que analisaremos a seguir.
Coleções Imutáveis
Uma classe imutável é uma classe cujas instâncias não podem ser modificadas. Toda a informação das instâncias de classes imutáveis é inserida no momento da instanciação (ou seja, no construtor) e jamais são alteradas. Na API da linguagem Java temos diversos exemplos de classes imutáveis, por exemplo, String, Double, Float e BigDecimal. Para ilustrar melhor, se você criar uma variável x do tipo String com o valor “Java”, e depois atribuir o valor “Magazine” nesta mesma variável x, na verdade você instanciou dois objetos. A String “Java” jamais será alterada, e se não houver nenhuma outra referência para ela, ficará então disponível para ser limpa pelo Garbage Collector (GC). É exatamente por esta razão que em Java utilizam-se objetos StringBuilder e StringBuffer para concatenação de Strings. Perceba que não há método algum no objeto String que permita que seu valor seja modificado.
Em seu livro Effective Java – Second Edition, Joshua Bloch afirma que classes imutáveis são mais fáceis de projetar, implementar e utilizar do que classes mutáveis, e ainda são mais seguras e menos propensas a erros.
Cinco regras devem ser respeitadas para que um objeto possa ser considerado imutável:
1. Nenhum método pode alterar o estado do objeto;
2. A classe deve possuir um modificador final para que nãopossa ser estendida;
3. Todos os atributos devem possuir o modificador final para que não possam ser alterados;
4. Todos os atributos devem ser privados;
5. Se a classe possuir algum atributo que seja um objeto mutável, deve garantir que esse atributo não possa ser acessado por objetos externos, mas se for necessário que objetos externos tenham acesso ao objeto mutável, é preciso fazer uma ...