Quais são as grandes melhorias entre as bibliotecas equivalentes a goiaba e apache?

123

Atualmente, usamos coleções apache, utilitários de strings, etc. Preciso decidir se devemos mudar da implementação das fundações do apache.

O critério importante é a facilidade de uso dos desenvolvedores. O desempenho / uso da memória ainda não é uma questão importante para nós. A velocidade do desenvolvimento é o principal critério neste momento.

Eu apreciaria opiniões sobre como a vida do desenvolvedor se tornou significativamente mais fácil com a goiaba.

Pat
fonte

Respostas:

223

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 ForwardXXXcoleçõ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

Etienne Neveu
fonte
Obrigado! * blushes * Acabei de editar minha resposta para falar mais sobre o desenvolvimento muito ativo do Guava e para detalhar melhor os recursos do Java 1.5.
precisa
1
Acabei de notar que Kevin Bourrillion fala sobre Guava vs Apache Commons nesta conversa: youtube.com/watch?v=9ni_KEkHfto#t=42m38s
Etienne Neveu
Uma observação: o Guava altera suas APIs e desaprova seus métodos antigos com frequência, portanto, ter dependências pode causar problemas como bloqueio de versão e incompatibilidade com outras bibliotecas de terceiros que usam o Guava.
Archimedes Trajano
24

Uso goiaba desde agosto de 2010, começando com o lançamento do r06. Basicamente, eu tinha uma biblioteca java greenfield para desenvolver, então procurei a melhor biblioteca auxiliar para a API J2SE. Tradicionalmente, tínhamos usado as bibliotecas do Apache Commons, mas eu queria ver o que havia por aí e começar a usar o Guava.

Prós

  1. Construções da linguagem Java 5.0. A biblioteca usa a maioria das dicas de design do "Effective Java: 2nd Edition" de Bloch: Imutabilidade, padrão de construtor, fábricas em vez de construtores, genéricos etc. Isso torna seu código mais rígido e mais expressivo.
  2. Suporte à programação funcional, em particular com as interfaces Function e Predicate de nível superior.

Contras

  1. Não é um substituto suficiente para o Apache Commons, em particular o codec comum.
  2. Não existe um 'livro de receitas de goiaba'. A biblioteca é minimalista e ortogonal. Assim, há uma curva de aprendizado definida para tirar o máximo proveito dela. Como mencionado, o Javadoc é excelente, mas alguns estudos de caso de código fonte mais longos seriam úteis.
  3. Se você estiver em um ambiente que requer Java 1.3 ou 1.4, não terá sorte.

Para mim, o Guava faz o Java parecer mais próximo de uma linguagem de script concisa e expressiva, e isso é ótimo.

miniharryc
fonte
16

Na minha experiência, não percebo que eles se enfrentem ou que a goiaba melhore as bibliotecas do apache. Em vez disso, a goiaba complementa as bibliotecas do apache. Existem classes e utilitários na goiaba que não estão no apache e vice-versa.

Portanto, não sei se você precisa mudar por si só - eu diria "use a ferramenta certa para o trabalho certo".

javamonkey79
fonte
1
Cheguei a essas conclusões recentemente, depois de ver que o Guava não tinha nada parecido com o que o Apache oferece no FileNameUtils (sim, há sobreposição, mas o FileNameUtils do Apache tem muito mais do que os arquivos do Guava. Além disso, por que o Google precisava usar Files? para usar o JDK Files, tenho que escrever o caminho inteiro ...). Meu aplicativo precisava de muito utilitário de arquivos, então não pude evitar o uso do Apache nesse caso.
Don Cheadle