Primeiro, como javamonkey79 explicou, enquanto o Google Guava e o Apache Commons compartilham recursos semelhantes, ambos também possuem funcionalidades ausentes do seu homólogo. Portanto, limitar-se a apenas uma biblioteca pode ser imprudente.
Dito isto, se eu tivesse que escolher, eu optaria por usar o Guava, mantendo o Apache Commons nos casos (raros) em que o Guava não possui a funcionalidade necessária. Deixe-me tentar explicar o porquê.
Goiaba é mais "moderna"
O Apache Commons é uma biblioteca realmente madura, mas também tem quase 10 anos e tem como alvo o Java 1.4. O Guava foi de código aberto em 2007 , tem como alvo o Java 5 e, portanto, o Guava se beneficia bastante dos recursos do Java 5: genéricos , varargs , enums e autoboxing .
De acordo com os desenvolvedores do Guava, os genéricos são um dos motivos pelos quais eles escolheram criar uma nova biblioteca em vez de melhorar o Apache Commons (consulte as Perguntas frequentes sobre coleções do google , sob o título "Por que o Google construiu tudo isso, quando poderia tentar melhorar o Apache?" Coleções Commons em vez disso? " ).
Eu concordo com eles: embora muitas vezes sejam criticados (sem reificação, limitados devido à compatibilidade com versões anteriores), os genéricos Java ainda são muito úteis quando usados adequadamente, como o Guava faz. Prefiro sair do que trabalhar com coleções não geradas!
(Observe que o Apache Commons 3.0 tem como alvo o Java 1.5 ou superior)
A goiaba é muito bem projetada / documentada
O código está cheio de práticas recomendadas e padrões úteis para tornar a API mais legível, detectável, com desempenho, segura e segura para threads ...
Depois de ler Java eficaz (incrível livro BTW), vejo esses padrões em todo o código:
- métodos de fábrica (como
ImmutableList.copyOf()
)
- padrão do construtor (
ImmutableList.builder()
, Joiner
, CharMatcher
, Splitter
, Ordering
, ...)
- imutabilidade (coleções imutáveis,
CharMatcher
, Joiner
, Splitter
, ...)
- ocultação de implementação (
Predicates.xXx
, ...)
- favorecendo a composição sobre a herança (as
ForwardXXX
coleções)
- verificações nulas
- padrão enum-singleton
- proxies de serialização
- convenções de nomenclatura bem pensadas
Eu poderia continuar por horas explicando as vantagens trazidas por essas opções de design (diga-me se você quiser). O fato é que esses padrões não são apenas "para o show", eles têm um valor real: a API é um prazer de usar, mais fácil de aprender (eu esqueci de dizer o quão bem documentada é?), Mais eficiente e muitas classes são mais simples / protegidas de threads devido à sua imutabilidade.
Como um ponto de bônus, aprende-se muito olhando o código :)
A goiaba é consistente
Kevin Bourrillion (desenvolvedor líder do Guava) faz um ótimo trabalho mantendo um alto nível de qualidade / consistência em toda a biblioteca. É claro que ele não está sozinho, e muitos grandes desenvolvedores contribuíram para o Guava (até Joshua Bloch , que agora trabalha no Google!).
As principais filosofias e opções de design por trás do Guava são consistentes em toda a biblioteca, e os desenvolvedores seguem princípios muito bons de design de API (IMO), tendo aprendido com os erros passados das APIs do JDK (mas não com os erros deles ).
A goiaba possui uma alta relação potência / peso
Os designers do Guava resistem à tentação de adicionar muitos recursos, limitando a API aos mais úteis. Eles sabem que é muito difícil remover um recurso depois de adicionado e seguem o lema de Joshua Bloch no design da API: "Em caso de dúvida, deixe de fora" . Além disso, o uso da anotação @Beta permite testar algumas opções de design sem se comprometer com uma API específica .
As opções de design mencionadas acima permitem uma API muito compacta. Basta olhar para o MapMaker para ver a potência acumulada dentro de um construtor "simples". Outros exemplos bons (embora mais simples?) São CharMatcher , Splitter e Ordering .
Também é muito fácil compor várias partes da goiaba. Por exemplo, digamos que você deseja armazenar em cache o resultado de uma função complexa ? Alimente esta função ao seu MapMaker e BINGO, você terá um mapa / cache de computação seguro para threads. Precisa restringir as entradas de mapa / função a Strings específicas? Não há problema, envolva-o dentro de um ConstrainedMap , usando um CharMatcher para rejeitar Strings inadequadas ...
A goiaba está em desenvolvimento ativo
Embora o desenvolvimento do Apache Commons pareça ter acelerado com o trabalho no Commons Lang 3.0, o Guava parece ganhar mais força no momento, enquanto o Google abre mais fontes de suas classes internas.
Como o Google depende muito dele internamente, acho que não desaparecerá tão cedo. Além disso, o código aberto de suas bibliotecas comuns permite que o Google abra mais facilmente outras bibliotecas que dependem dela (em vez de reembalá- las, como o Guice atualmente faz ).
Conclusão
Por todas as razões acima, o Guava é minha biblioteca preferencial ao iniciar um novo projeto. E sou muito grato ao Google e aos incríveis desenvolvedores do Guava, que criaram esta fantástica biblioteca.
PS: você também pode querer ler esta outra pergunta do SO
PPS: ainda não possuo nenhum estoque do Google