Google Guava contre Apache Commons [fermé]
je cherchais une carte bidirectionnelle implémentation en Java, et je suis tombé sur ces deux bibliothèques:
- Google Guava (anciennement "Google Collections")
- Apache Commons Collections
tous les deux sont gratuits, ont l'implémentation de carte bidirectionnelle que je cherchais (BidiMap dans Apache, BiMap dans Google), sont étonnamment près de la même taille (Apache 493 ko, Google 499 ko) [ed. n'est plus vrai!] et semblent en tous les cas assez similaire à moi.
lequel choisir, et pourquoi? Existe-t-il d'autres solutions équivalentes (doit être libre et avoir au moins la carte bidirectionnelle)? Je travaille avec le dernier Java SE, donc pas besoin de limiter artificiellement à Java 5 ou quelque chose comme ça.
5 réponses
à mon avis, le meilleur choix est Goyave (anciennement connu sous le nom de Google collections):
- c'est plus moderne (les génériques)
- absolument suit les Collections de l'API exigences
- il est activement maintenu
-
CacheBuilder
et son prédécesseurMapMaker
sont tout simplement impressionnant
Apache Commons Collections est une bonne bibliothèque, mais il a longtemps refusé de fournir un génériques version activée (ce qui est un grands inconvénient pour l'une des collections de l'API à mon avis) et en général semble être dans un entretien/ne pas-faire-trop-trop-travail-sur-le mode Récemment Commons Collections a ramassé un peu de vapeur de nouveau, mais il a un peu de rattrapage à faire. .
si Télécharger taille / empreinte mémoire / Taille du code est un problème alors les Collections Apache Commons pourraient être un meilleur candidat, car il s'agit d'une dépendance commune des autres bibliothèques. Par conséquent, l'utiliser dans votre propre code pourrait potentiellement être fait sans ajouter de dépendances supplémentaires. Edit: cet "avantage" particulier a été partiellement neutralisé depuis maintenant, puisque de nombreuses nouvelles bibliothèques dépendent en fait de Guava et pas sur les collections Apache Commons.
les choses les plus importantes que j'ai trouvé qui font de Google Collections l'endroit pour commencer:
- génériques (Collections sans génériques -- FTL)
- cohérence avec le cadre de collecte (Josh Bloch était un acteur clé dans ce cadre)
- correct. Ces gars sont désespérément attachés à trouver le bon problème; ils ont quelque chose comme des tests de 25k unités, et sont liés à obtenir L'API juste.
Voici une vidéo Youtube d'une conférence qui a été donnée par l'auteur principal, et il fait un bon travail de discuter de ce qu'il est intéressant de savoir à propos de cette bibliothèque.
de la faq: Google Collections FAQ
Pourquoi Google a-t-il construit tout cela, alors qu'il aurait pu essayer d'améliorer les Collections Apache Commons à la place?
les Collections Apache Commons ne répondaient manifestement pas à nos besoins. Il n'utilise pas de génériques, ce qui est un problème pour nous que nous détestons obtenir compilation des avertissements de notre code. Elle a également été placée dans une exploitation modèle" pour un long moment. Nous avons pu voir que cela nécessiterait une un investissement important de notre part pour le réparer jusqu'à ce que nous soyons heureux de l'utiliser, et pendant ce temps, notre propre bibliothèque était déjà en pleine croissance organique.
une différence importante entre la bibliothèque Apache et la nôtre est que nos collections adhèrent très fidèlement aux contrats spécifiés par les interfaces JDK qu'ils implémentent. Si vous examinez L'Apache documentation, vous trouverez d'innombrables exemples de violation. Ils mérite le crédit pour avoir souligné ces si clairement, mais tout de même, déviant du comportement de collection standard est risqué! Vous devez faire attention à ce que vous faites avec une telle collection; les bogues sont toujours juste en attente d'arriver.
nos collections sont entièrement généralisées et ne violent jamais leurs contrats (à quelques exceptions près, où les implémentations JDK ont précédent pour les violations acceptables). Cela signifie que vous pouvez passer l'un de nos collections à toute méthode qui attend une collecte et une sensation je suis assez confiant que les choses fonctionneront exactement comme elles le devraient.
une chose désagréable à propos de la goyave est que Multimap n'étend pas java.util.Cartographie. Si vous avez vos propres méthodes qui fonctionnent sur les cartes, elles ne fonctionneront pas sur Guava Multimaps (L'interface D'Apache MultiMap étend java.util.Cartographie.) Je suis sûr qu'il y a une bonne raison pour laquelle c'est comme ça, mais c'est aussi gênant.
deux autres choses (j'espère que je ne me trompe pas)
- la licence de Guava (nouveau nom pour google collections) est la licence Apache 2.0, ce qui signifie: la même que pour Apache Commons project
- Je ne trouve pas le code source de Guava dans un fichier à télécharger (il semble que seul un accès git est possible)