Skip to content

Author archive for: gerben

Le futur de Java (Devoxx 2010)

Le débat « The Future of Java Discussion Panel » est disponible gratuitement chez parleys.com.

Je vous encourage à la regarder si vous voulez en savoir plus sur les dessous de la gestion de Java par Oracle.

De plus, l’excellent Joshua Bloch est présent, ce qui n’enlève rien.

PS: L’incrustation vidéo ne fonctionne pas toujours bien, voici le lien direct

Jongler avec les backslashes dans les regexps Java

Un des gros problèmes lorsqu’on utilise des regexp en Java est que le backslash doit être quadruplé.

En effet, pour représenter un backslash dans une String, il faut le doubler (échappement). De plus, ce caractère doit aussi être échappé dans une regexp ce qui nous amène à un total de 4 backslashes au lieu d’un.

Il existe cependant une méthode qui peut grandement vous simplifier la tâche :

Pattern.quote(String)

Cette méthode se charge d’échapper tous les caractères spéciaux liés aux regexps. Par exemple, pour séparer une chaîne contenant des « – » :

String[] result = "a-b-c-d".split(Pattern.quote("-"));

Dans le cas des backslashes, il faut toujours les doubler dans la chaîne mais ça reste plus compréhensible.

Google Guava : trier des éléments à champs nullables

Voici un problème auquel j’ai été confronté plus d’une fois : trier en java des éléments en fonction d’un de ses attributs … qui peut être null.

La méthode classique pour faire ça : le bon vieux comparateur, mais qui devient vite compliqué avec les test de nullité :

Comparator<MonBean> byLibelle = new Comparator<MonBean>() {
      public int compare(final MonBean b1, final MonBean b2) {
        if (b1.getLibelle() == null) {
          // null des deux côté
          if (b2.getLibelle() == null) {
            return 0;
          } else {
            // b2 non null, donc supérieur
            return -1;
          }
        } else {
          if (b2.getLibelle() == null) {
            // b2 null, b1 est donc supérieur
            return 1;
          } 
        }       
        return b1.getLibelle().compareTo(b2.getLibelle());
      }
   };
Collections.sort(myList, byLibelle);

Bon, c’est un peu bourrin, moche, mais ça fonctionne.

Voici une autre solution beaucoup plus élégante utilisant la classe Ordering de Guava :

    Comparator<MonBean> byLibelle = new Comparator<MonBean>() {
	  public int compare(final MonBean b1, final MonBean b2) {
		return Ordering.natural().
                      nullsFirst().
                      compare(b1.getLibelle(), 
                                     b2.getLibelle());
	  }    	
	};
    Collections.sort(myList, byLibelle);

Ici, Ordering.natural().nullsFirst() retourne une instance de la classe Ordering effectuant un classement par ordre naturel avec les éléments nulls en premier. Simple non ?

Ce qu’il faut retenir, c’est qu’Ordering est un Comparator aux hormones permettant d’effectuer des tris multiples, d’appliquer une fonction sur les éléments avant le tri, etc …

[ Ordering, Javadoc ]

Google Guava : la classe MapMaker

Parmi les bibliothèques Guava fournies par Google (si vous ne connaissez pas, je vous les recommande), la classe MapMaker mérite toute votre attention, elle permet de construire des ConcurrentMaps dont le comportement est fortement paramétrable.

Voici un exemple issu de la javadoc :

 ConcurrentMap<Key, Graph> graphs = new MapMaker()
       .concurrencyLevel(32)
       .softKeys()
       .weakValues()
       .expiration(30, TimeUnit.MINUTES)
       .makeComputingMap(
           new Function<Key, Graph>() {
             public Graph apply(Key key) {
               return createExpensiveGraph(key);
             }
           });

Parmi les fonctionnalités intéressantes de cette classe, on peut noter les possibilités:

  • utiliser des SoftReference ou WeakReference comme clé ou valeur de la map
  • de faire expirer des éléments de la map après un délai déterminé
  • de mettre en place un Listener de suppression des éléments
  • de générer les éléments de la map à la demande via une fonction de calcul (makeComputingMap)

Puissant et utile ! :)

[ Slides de présentation de Guava ]
[ Les bibliothèques Google Guava ]
[ MapMaker (JavaDoc) ]

Présentation sur l’agilité au Chti’JUG

On m’a demandé récemment une présentation rapide de « l’agilité »; pris par le temps, je me suis contenté de citer les valeurs agiles principales.

Voici une présentation générale intitulée Comment apporter un maximum de valeur à nos utilisateurs en moins de 3 mois… puis recommencer ?

Agilité – Chti’JUG du 16 mars 2010 – Seconde partie from ProxiAD Videos on Vimeo.

Un petit rappel des valeurs agiles, en passant :

  • Les individus et leurs interactions plutôt que des méthodes et outils
  • Un logiciel qui fonctionne plutôt qu’une documentation super exhaustive
  • La collaboration avec le client plutôt que des négociations contractuelles
  • Répondre au changement plutôt que de suivre un plan

[ Le manifeste agile ]
[ Les conférences du chti jug en video ]