Nous utilisons actuellement des collections Apache, des utilitaires de chaîne, etc. Je dois décider si nous devons passer de l'implémentation des fondations Apache.
Le critère important est la facilité d'utilisation des développeurs. Les performances/l'utilisation de la mémoire ne sont pas encore un problème important pour nous. La vitesse de développement est le critère clé à ce stade.
J'apprécierais les opinions sur la façon dont la vie du développeur est devenue beaucoup plus facile avec la goyave.
Tout d'abord, comme javamonkey79 expliqué, bien que Google Guava et Apache Commons partagent des fonctionnalités similaires, ils ont également des fonctionnalités qui sont absentes de leur homologue. Ainsi, vous limiter à une seule bibliothèque peut être imprudent.
Cela étant dit, si je devais choisir, je choisirais d'utiliser la goyave, en gardant Apache Commons dans les (rares) cas où la goyave n'a pas les fonctionnalités nécessaires. Permettez-moi d'essayer d'expliquer pourquoi.
Apache Commons est une bibliothèque vraiment mature, mais elle a aussi presque 10 ans et cible Java 1.4. Guava était open source en 2007 , target Java 5, et donc La goyave bénéficie grandement des fonctionnalités Java 5: génériques, varargs, énumérations et autoboxing.
Selon les développeurs de Guava, les génériques sont l'une des raisons pour lesquelles ils ont choisi de créer une nouvelle bibliothèque au lieu d'améliorer Apache Commons (voir la FAQ Google-collections , sous le titre "Pourquoi Google a-t-il construit cela, alors qu'il aurait pu essayer d'améliorer les collections Apache Commons à la place? ").
Je suis d'accord avec eux: bien que souvent critiqués (pas de réification, limité en raison de la compatibilité descendante), Java sont toujours très utile lorsqu'il est utilisé de manière appropriée, comme le fait la goyave. Je préfère quitter plutôt que de travailler avec des collections non générées!
(Notez qu'Apache Commons 3.0, cible Java 1.5 +)
Le code regorge de bonnes pratiques et de modèles utiles pour rendre l'API plus lisible, détectable, performante, sécurisée, thread-safe ...
Après avoir lu Java efficace (livre génial BTW), je vois ces modèles partout dans le code:
ImmutableList.copyOf()
)ImmutableList.builder()
, Joiner
, CharMatcher
, Splitter
, Ordering
, ...)CharMatcher
, Joiner
, Splitter
, ...)Predicates.xXx
, ...)ForwardXXX
)Je pourrais continuer pendant des heures à expliquer les avantages apportés par ces choix de conception (dites-moi si vous le souhaitez). Le fait est que ces modèles ne sont pas seulement "pour le spectacle", ils ont une réelle valeur: l'API est un plaisir à utiliser, plus facile à apprendre (ai-je oublié de dire à quel point elle est bien documentée?), Plus efficace et de nombreuses classes sont plus simples/thread-safe en raison de leur immuabilité.
En bonus, on apprend beaucoup en regardant le code :)
Kevin Bourrillion (développeur principal de Guava) fait un excellent travail en maintenant un haut niveau de qualité/cohérence à travers la bibliothèque. Il n'est bien sûr pas seul, et beaucoup de grands développeurs ont contribué à Guava (même Joshua Bloch , qui travaille maintenant chez Google!).
Les philosophies de base et les choix de conception derrière Guava sont cohérents dans toute la bibliothèque, et les développeurs adhèrent aux très bons principes de conception de l'API (IMO), ayant appris des erreurs passées des API JDK (pas leur erreurs , bien que).
Les concepteurs de Guava résistent à la tentation d'ajouter trop de fonctionnalités, limitant l'API aux plus utiles. Ils savent qu'il est très difficile de supprimer une fonctionnalité une fois ajoutée, et de suivre la devise de Joshua Bloch sur la conception de l'API: "En cas de doute, laissez-la de côté" . En outre, l'utilisation de l'annotation @Beta leur permet de tester certains choix de conception sans s'engager sur une API spécifique .
Les choix de conception mentionnés ci-dessus permettent une API très compacte. Regardez simplement MapMaker pour voir la puissance contenue dans un constructeur "simple". D'autres bons exemples (bien que plus simples?) Sont CharMatcher , Splitter et Ordering .
Il est également très facile de composer différentes parties de la goyave. Par exemple, disons que vous voulez mettre en cache le résultat d'un complexe fonction ? Alimentez cette fonction à votre MapMaker et BINGO, vous avez une carte informatique/cache thread-safe. Besoin de contraindre les entrées de carte/fonction à des chaînes spécifiques? Pas de problème, enveloppez-le dans un ConstrainedMap , en utilisant un CharMatcher pour rejeter les chaînes inappropriées ...
Alors que le développement d'Apache Commons semble s'être accéléré avec le travail sur Commons Lang 3.0, Guava semble prendre plus de vapeur en ce moment, tandis que Google ouvre des sources plus de leurs classes internes.
Étant donné que Google s'appuie fortement sur elle en interne, je ne pense pas que cela va disparaître de si tôt. De plus, le sourcing ouvert de ses bibliothèques communes permet à Google d'ouvrir plus facilement les sources autres des bibliothèques qui en dépendent (au lieu de reconditionnement eux, comme Guice actuellement ne ).
Pour toutes les raisons ci-dessus, Guava est ma bibliothèque de référence lors du démarrage d'un nouveau projet. Et je suis très reconnaissant à Google et aux géniaux développeurs de Guava, qui ont créé cette fantastique bibliothèque.
PS: vous voudrez peut-être aussi lire cette autre SO question
PPS: je ne possède pas (encore) de stock Google
J'utilise la goyave depuis août 2010, en commençant par la version r06. Fondamentalement, j'avais un greenfield Java bibliothèque à développer, j'ai donc cherché la meilleure bibliothèque auxiliaire pour l'API J2SE. Traditionnellement, nous avions utilisé les bibliothèques Apache Commons, mais je voulais voir ce qui était là-bas et a commencé à utiliser la goyave.
Pour moi, Guava fait que Java se sent plus proche d'un langage de script expressif et concis, et c'est génial.
D'après mon expérience, je ne perçois pas qu'ils se combattent ou que la goyave améliore les bibliothèques Apache. Au contraire, goyave complète les bibliothèques Apache. Il existe des classes et des utilitaires en goyave qui ne sont pas dans Apache et vice versa.
Par conséquent, je ne sais pas si vous devez changer en soi - je dirais "utilisez le bon outil pour le bon travail".