Le Touilleur Express

  • Accueil
  • A propos de l’auteur
  • A propos du Touilleur Express
Next Previous

Google Guava, partie 1

3 novembre, 2010

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

  • CaseFormat
  • CharMatcher
  • Charsets
  • Joiner
  • Splitter
  • Strings

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.

  • Function,
    Functions
  • Predicate,
    Predicates
  • Supplier,
    Suppliers

Je vous proposerai dans un deuxième article une présentation détaillée de Google Guava.

Autres

  • Defaults
  • FinalizableReference and subtypes
  • Objects
  • 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.

0 no like

Articles similaires:

Default ThumbnailJBoss Seam 2.0 Beta ajoute le support de Groovy et du Google Web Toolkit Default ThumbnailLancement de Google Buzz, le tueur de Twitter ? Default ThumbnailGoogle a de belles courbes, comme Paris Hilton Default ThumbnailGoogle BigQuery
  • Fabszn 3 novembre 2010 at 9 h 24 min

    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.

  • Eligriv 3 novembre 2010 at 10 h 24 min

    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 😉

  • Dominique De Vito 3 novembre 2010 at 18 h 14 min

    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…

  • Eligriv 4 novembre 2010 at 10 h 53 min

    @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 !

  • msepehr 12 novembre 2010 at 13 h 33 min

    salut, api intéressante, merci!

    @Eligriv : petite inattention du matin, le retour? 😉
    if (noSpecialChars.matchesAllOf(username)) {

  • eric 26 novembre 2010 at 14 h 27 min

    Super API, merci. 🙂

Derniers articles

  • L’instant T où tu poses ta dém…

    Retour d’expérience sur la démission et le moment où vous devez quitter une entreprise.

    6 likes

    24 octobre, 2024
  • The « Robinson » projection – comprendre son système d’information

    Nous sommes en juillet 2022 chez Doctolib. Je travaille sur un projet

    5 likes

    22 octobre, 2024
  • Réussir son démarrage comme Staff/Principal Engineer dans une nouvelle entreprise

    Je prépare une présentation avec mon collègue Théotime pour la conférence Cloud

    3 likes

    6 octobre, 2024

Mots clés

Apple (32) Architecture (14) Big Data (5) Conference (8) Devoxx (55) Dev Web (37) Doctolib (2) geekevent (1) groovy (2) Innoteria (11) Java (517) Linux (10) Non classé (15) Perso (266) Recrutement (2) Scala (30) scrum (43) Société (3) Staff Engineer (5) Startup (21) Web 2.0 (67)

Le Touilleur Express

Blog par Nicolas Martignole

Contactez-moi : nicolas@touilleur-express.fr

Suivez-moi sur X (Twitter) : @nmartignole

Copyright© 2008 - 2024 Nicolas Martignole | Tous droits réservés
  • A propos de l’auteur
  • A propos du Touilleur Express
  • Reset Password

Le Touilleur Express