web-dev-qa-db-fra.com

Quelles sont les grandes améliorations entre les bibliothèques équivalentes à goyave et Apache?

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.

123
Pat

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.

La goyave est plus "moderne"

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 +)

La goyave est très bien conçue/documentée

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:

  • méthodes d'usine (telles que ImmutableList.copyOf())
  • modèle de générateur (ImmutableList.builder(), Joiner, CharMatcher, Splitter, Ordering, ...)
  • immuabilité (collections immuables, CharMatcher, Joiner, Splitter, ...)
  • mise en œuvre masquage (Predicates.xXx, ...)
  • privilégiant la composition à l'héritage (les collections ForwardXXX)
  • vérifications nulles
  • motif enum-singleton
  • proxys de sérialisation
  • conventions de nommage bien pensées

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 :)

La goyave est cohérente

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).

La goyave a un rapport puissance/poids élevé

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 ...

La goyave est en développement actif

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 ).

Conclusion

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

223
Etienne Neveu

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.

Avantages

  1. Constructions du langage Java 5.0. La bibliothèque prend la plupart de ses repères de conception de Bloch "Effective Java: 2nd Edition": immuabilité, modèle de constructeur, usines au lieu de constructeurs, génériques, etc. Cela rend votre code plus serré et plus expressif.
  2. Prise en charge de la programmation fonctionnelle, en particulier avec les interfaces de fonction et de prédicat de haut niveau.

Les inconvénients

  1. Ce n'est pas un remplacement suffisant pour Apache Commons, en particulier le codec commun.
  2. Il n'y a pas de "livre de recettes de goyave". La bibliothèque est à la fois minimaliste et orthogonale. Ainsi, il existe une courbe d'apprentissage définie pour en tirer pleinement parti. Comme mentionné, le Javadoc est excellent, mais des études de cas de code source plus longues seraient utiles.
  3. Si vous êtes dans un environnement nécessitant Java 1.3 ou 1.4, vous n'avez pas de chance.

Pour moi, Guava fait que Java se sent plus proche d'un langage de script expressif et concis, et c'est génial.

24
miniharryc

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".

16
javamonkey79