La librairie Java Google Guava est une librairie sous licence Apache 2.0 simple et pratique. Elle vous offre un ensemble de classes utiles pour des usages assez fréquents comme la gestion des collections, la gestion des fichiers, des types simples ou de la synchronisation. J’ai aussi appris quelques astuces en lisant le code et en travaillant sur différents exercices. Je vous propose de la découvrir ensemble.
Encore une librairie ?
Chacun de nous a ses petites habitudes. Je pense que la connaissance du vaste écosystème des projets open-source du monde Java est assez difficile. Pourtant ce qui fait la force de notre plateforme, c’est bien cette quantité impressionnante de projets et de librairies. Quel est l’intérêt d’utiliser une librairie plutôt que de la développer soi-même ? Le gain de temps, le fait qu’une librairie populaire est plutôt bien testée par la communauté et enfin la possibilité de trouver de l’aide sur Internet, ou des articles d’exemples, comme celui-ci.
Les packages
La librairie propose les packages suivants:
– com.google.common.annotations
– com.google.common.base
– com.google.common.collect
– com.google.common.io
– com.google.common.net
– com.google.common.primitives
– com.google.common.util.concurrent
La librairie Google Collections a été regroupée à l’intérieur de Google Guava. La librairie tire son nom de la goyave, fruit à peau verte et à coeur rouge, qui réserve une surprise à celui qui ouvre le fruit en deux.
Le package com.google.common.annotations ne contient que 4 annotations pour marquer certaines classes comme étant compatible ou non avec GWT, pour marquer en @Beta les classes susceptibles de changer. L’annotation @VisibleForTesting permet de marquer une méthode comme ayant été rendu visible uniquement pour les tests. Je pense à un setId dans une entité comme dans l’article sur JPA2.
Le package com.google.common.base regroupe plusieurs familles de classes. Tout ce qui permet de manipuler les chaînes de caractères, ensuite ce qui permet d’introduire des notions de programmation fonctionnelle en Java et enfin différentes classes pratiques comme Objects ou Preconditions que nous avions vu dans l’article sur JPA et les tests.
Classes utilitaires pour la manipulation de caractères et de chaines
La classe CharMatcher est une version plus lisible des Regex et des Patterns matchers de Java. Je vous conseille l’usage de cette classe pour rendre votre code plus lisible. Par exemple je m’en servirai pour valider si le nom d’un utilisateur ne contient pas de caractères interdits dans mon application de cette façon :
package org.letouilleur.sample; import com.google.common.base.CharMatcher; import com.google.common.base.Preconditions; import org.junit.Test; import static org.junit.Assert.*; public class TestGuava { @Test public void testCharMatcherIsin() { String username = "Nicolas"; String badUserName = "Nic ! olas,, @ et ?"; assertTrue(validateUsername(username)); assertFalse(validateUsername(badUserName)); } /** * Validates that the username does not contains one of !@?(,) * * @param username is the username to validate. * * @return true if none of the char in username is in the restricted list. */ public static boolean validateUsername(String username) { Preconditions.checkNotNull(username); // Je ne veux pas de caractères spéciaux dans les mots de passe ou les noms d'utilisateur CharMatcher noSpecialChars = CharMatcher.noneOf("!@?(,)").negate(); if (noSpecialChars.matchesNoneOf(username)) { System.out.println(username + " is a valid username"); return true; } System.out.println("Please do not use one of !@?(,) in your username value."); return false; } }
Types fonctionnels
Google Guava permet d’écrire certaines parties de votre programme Java de manière plus fonctionnelle.
C’est ce qui m’intéresse le plus dans Guava. Google a regroupé un ensemble de fonctions qui apporte un peu de vision fonctionnelle à votre programmation. Un exemple simple : j’ai remplacé des NamedQuery assez compliquées sur des Entités JPA par des appels avec Guava. Ceci permet d’extraire la partie métier et de la rentre visible et testable dans le code. J’ai pu le faire car la table en base est simple et petite.
Je vous proposerai dans un deuxième article une présentation détaillée de Google Guava.
Autres
Defaults
FinalizableReference
and subtypesObjects
Preconditions
Throwables
La classe Preconditions s’importe en général de manière statique dans votre code. Elle regroupe beaucoup de méthodes simples comme checkNotNull(Object o) qui remplace 3 lignes de if(o==null) throw new NullPointerException. Mais surtout, Preconditions permet de rendre plus expressif votre code métier.
Sans Guava if (count < = 0) { throw new IllegalArgumentException("must be positive: " + count); } devient checkArgument(count > 0, "must be positive: %s", count);
Continuer la lecture et aller à la partie 2 : faire du fonctionnel avec Guava
Références
– Le site de Google Guava
– Une série d’article en Anglais sur Google Guava
– Exploring Google Guava par Dan Lewis d’OCI.
Hello,
Intéressant. Je trouve, entre autre, la classe Precondition trés utile. Elle permet vraiment de clarifier le code d’une méthode en éliminant certain détail.
J’aime beaucoup cette api.
Tiens, je vais pinailler un peu :p
Dans l’exemple sur le matcher, il y a une triple négation, du coup c’est pas très clair :
CharMatcher noSpecialChars = CharMatcher.noneOf(« !@?(,) »).negate();
-> ici noSpecialChars matche uniquement les specials chars :
noneOf + negate = anyOf
if (noSpecialChars.matchesNoneOf(username)) {
-> du coup, pour valider, on vérifie que le username ne match aucun special char
Voila, c’était pour t’embêter, sinon, bon article 😉
Oui, pas clair du tout la triple négation pour l’exemple CharMatcher.
Pour une classe vantée comme une version plus lisible des Regex et des Patterns matchers de Java, c’est pour le moins décevant…
@Dominique : ne pas confondre une petite erreur d’inattention du matin et un problème d’api.
si on écrit :
CharMatcher noSpecialChars = CharMatcher.noneOf(« !@?(,) »);
if (noSpecialChars.matches(username)) {
// …
}
on voit directement l’utilité des matchers !
salut, api intéressante, merci!
@Eligriv : petite inattention du matin, le retour? 😉
if (noSpecialChars.matchesAllOf(username)) {
Super API, merci. 🙂