Le Touilleur ExpressLe Touilleur ExpressLe Touilleur ExpressLe Touilleur Express
  • Accueil
  • A propos de l’auteur
  • A propos du Touilleur Express

Google Guava, partie 1

    Home Java Google Guava, partie 1

    Google Guava, partie 1

    Par Nicolas Martignole | Java | 9 commentaires | 3 novembre, 2010 | 0 | 11 433 affichages
         

    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.

    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
    google, guava, Java
    • Avatar
      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.

    • Avatar
      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 😉

    • Avatar
      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…

    • Avatar
      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 !

    • Avatar
      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)) {

    • Avatar
      eric 26 novembre 2010 at 14 h 27 min

      Super API, merci. 🙂

    Recent Posts

    • GitHub Actions : le tueur de Jenkins ?

      Avouez-le : ce titre de blog est super racoleur. J’avais aussi pensé

      15 février, 2021
    • Comment recréer du lien social dans l’Entreprise avec des outils numériques en 2021

      Nous sommes en février 2021 pendant le 3ème confinement lié à la

      10 février, 2021
    • FizzBuzz en Java et Scala (surtout Scala)

      L’exercice FizzBuzz est un petit exercice très simple, à tester par exemple

      9 février, 2021

    Recent Tweets

    •  @steeve  Excellente idée 😎👍🏻

      3 minutes ago
    • RT  @steeve : Si tu as déjà effacé une DB en prod, testé des règles iptables via ssh ou passé un crash loop sur une app iOS, viens nous racon…

      3 minutes ago
    • J'ai refais/modernisé l'authentification OAuth2 pour Google, Github et LinkedIn sur le CFP de Devoxx FR.

      3 hours ago
    •  @LostInBrittany   @FGRibreau   @aheritier  😎

      22 hours ago
    •  @LostInBrittany   @FGRibreau   @aheritier  J ai un souci GitHub demain à corriger aussi avec oauth2

      22 hours ago

    Mots clés

    agile (18) ajax (11) Apple (11) architecture (6) barcamp (5) BarCampJavaParis (5) ddd (5) devoxx (33) esb (6) exo (6) flex (9) geek (5) google (11) grails (5) groovy (10) humeur (12) humour (7) independant (6) iphone (12) Java (77) javascript (7) jazoon (28) jboss (22) jboss seam (12) jsf (9) jug (16) Linux (11) mac (6) mule (5) parisjug (7) paris jug (22) pjug (6) play (8) playframework (6) portlet (5) recrutement (6) ria (8) Scala (21) scrum (44) spring (23) Startup (11) usi (21) usi2010 (9) web (16) xebia (7)

    Le Touilleur Express

    Contactez-moi : nicolas@touilleur-express.fr

    Suivez-moi sur Twitter : @nmartignole

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