Pergunta

Eu estava procurando por um bidirecional mapear implementação em Java, e deparei com essas duas bibliotecas:

Ambos são gratuitos, têm a implementação mapa bidirecional que eu estava procurando (BidiMap em Apache, bitmap no Google), são incrivelmente quase o mesmo tamanho (Apache 493 kB, Google 499 kB) [ed .: não é verdade! ] e parecem de todas as maneiras muito semelhantes a mim.

Qual deles devo escolher e por quê? Existem algumas outras alternativas equivalentes (deve ser livre e ter pelo menos o mapa bidirecional)? Eu estou trabalhando com o mais recente do Java SE, por isso não há necessidade de limitar artificialmente a Java 5 ou qualquer coisa assim.

Foi útil?

Solução

Na minha opinião, a melhor escolha é Goiaba (anteriormente conhecido como Google coleções):

  • é mais moderno (tem genéricos)
  • absolutamente segue as coleções requisitos API
  • é mantido ativamente
  • CacheBuilder e seu antecessor MapMaker são simplesmente incrível

Apache Commons Collections é uma biblioteca boa, mas há muito tempo não forneceu uma versão genéricos habilitados (que é uma principal desvantagem para uma API coleções na minha opinião) e, geralmente, parece estar em manutenção / nem-do-muito-muito-trabalho-on-it modo recentemente Commons Collections tenha pego algum vapor de novo, mas tem algumas recuperar o que fazer. .

Se o tamanho de download / consumo de memória / code é um problema, então Apache Commons Collections pode ser um candidato melhor, uma vez que é uma dependência comum de outras bibliotecas. Portanto usá-lo em seu próprio código, bem poderia ser feito sem a adição de quaisquer dependências adicionais. Edit:. Este "vantagem" em particular foi parcialmente subvertida por agora, uma vez que muitas novas bibliotecas realmente dependem goiaba e não no Apache Commons Collections

Outras dicas

As coisas mais importantes que eu achei que tornar o Google Collections o lugar para começar:

  • Generics (Collections sem Generics - FTL)
  • Coerência com quadro Collections (Josh Bloch foi um jogador chave neste quadro)
  • Correto. Esses caras são amarrados desesperadamente para obter este problema direita; eles têm algo como testes de unidade 25K, e estão vinculados a obter a API apenas para a direita.

Aqui está uma grande Youtube vídeo de uma palestra que foi dado pelo autor principal e ele faz um bom trabalho de discutir o que vale a pena saber sobre esta biblioteca.

Desde o FAQ: Google Collections FAQ

Por que o Google construir tudo isso, quando poderia ter tentado melhorar os Apache Commons Collections vez?

Os Apache Commons Collections muito claramente não atender às nossas necessidades. isto não usar os genéricos, que é um problema para nós como nós odiamos para obter avisos de compilação de nosso código. Ele também tem sido uma "participação padrão" por um longo tempo. Pudemos ver que isso exigiria uma bonita grande investimento de nós para corrigi-lo até ficamos felizes para usá-lo, e, entretanto, a nossa própria biblioteca já estava crescendo organicamente.

Uma diferença importante entre a biblioteca Apache eo nosso é que nossas coleções muito fielmente aderir aos contratos especificados pela o JDK interface que implementar. Se você analisar o Apache documentação, você vai encontrar inúmeros exemplos de violações. Eles merecem crédito por apontar estes para fora tão claramente, mas ainda assim, desviando do comportamento coleção padrão é arriscado! Você deve ter cuidado com o você faz com essa coleção a; bugs são sempre apenas esperando para acontecer.

Nossas coleções são totalmente generified e nunca violar seus contratos (Com exceções isoladas, onde implementações JDK criaram uma forte precedente para violações aceitáveis). Isto significa que você pode passar um dos nossas coleções para qualquer método que espera uma coleção ea sensação bastante confiante de que as coisas vão funcionar exatamente como deveriam.

Duas outras coisas (eu espero que eu não estou errado)

  • A licença de goiaba (novo nome para coleções do Google) é a Apache License 2.0, ou seja: o mesmo que para o projeto Apache Commons
  • Não consigo encontrar o código fonte de goiaba em um arquivo para download (parece apenas uma git-acesso é possível)

Uma coisa desagradável sobre Goiaba é que Multimap não se estende java.util.Map. Se você tem seus próprios métodos que o trabalho no Google Maps que não vai funcionar em Guava Multimaps (interface de Apache MultiMap se estende java.util.Map). Tenho certeza de que há alguma boa razão para isso é a maneira que é, mas também é inconveniente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top