Pages

lundi 2 juin 2014

Formater ses messages sous forme de chaines de caractères

Dans la vie de développeur, on passe beaucoup de temps à lire du code, et du code souvent écrit par d'autres. J'aime le code simple et lisible et je voulais faire un focus sur une fonctionnalité qui n'a pas l'air toujours connue. Est ce mon passé éphémère de développeur C qui refait surface ?


Je voulais parler du formatage des chaines de caractères non internationalisées et utilisées notamment dans les messages d'erreur, les tests ou ailleurs. Prenons un exemple avec des articles définis de la manière suivante

private class Article {
        Date dateCreation;
        String label;
        String code;
        int nbLines;
    }

Si je veux afficher un message lié à mon article je vais retrouver souvent dans le code

System.out.println("error on saving article code=[" + article.getCode()
                + "] label=[" + article.getLabel() + "] nblines="
                + article.getNbLines() + " creation=["
                + article.getDateCreation() + "]");

qui donnera le message suivant

error on saving article code=[JAVA54] label=[Formater ces messages] nblines=50 creation=[Fri May 30 16:57:15 CEST 2014]

La classe Formatter offre tout ce qu'il faut pour afficher et formater des des chaines de caractères, des numériques, des booléens et même des dates. Reprenons notre exemple, on pourrait obtenir exactement le même résultat en utilisant

System.out.println(String.format("error on saving article %s label=[%s] nblines=%d write creation=[%s]", 
                article.getCode(), 
                article.getLabel(), 
                article.getNbLines(), 
                article.getDateCreation()));

Les éléments à formater sont identifier par le caractère % et la lettre après indique comment la donnée sera formatée. Quelques exemples
  • s : string
  • d : decimal
  • b : boolean

Personnellement je m'arrête à ces trois formaters. Quand vous ne savez pas trop quoi utiliser, employez %s car tout objet java contient une méthode toString() et avec l'autoboxing pas de surprise avec les types primitifs....

Vous pouvez même formater le message en utilisant des sauts de lignes ou des tabulations.

System.out.println(String.format("error on saving article %s \n\tlabel=[%s] \n\tnblines=%d \n\twrite creation=[%s]",
                article.getCode(),
                article.getLabel(),
                article.getNbLines(),
                article.getDateCreation()));

Cette portion de code donne
error on saving article JAVA54 
 label=[Formater ces messages] 
 nblines=50 
 write creation=[ven. mai 30 16:57:15 CEST 2014]

Vous pouvez avoir un formatage particulier en fonction du type des objets. Par exemple vous voulez afficher une date formatée à la française, à l'anglaise...

String msg = "error on saving article write on [%tc]";
System.out.println(String.format(Locale.FRANCE, msg, article.getDateCreation()));
System.out.println(String.format(Locale.ENGLISH, msg, article.getDateCreation()));

Le résultat est le suivant
error on saving article write on [ven. mai 30 17:12:07 CEST 2014]
error on saving article write on [Fri May 30 17:12:07 CEST 2014]

Bon voilà je ne sais pas si je vous ai convaincu mais si oui je prendrai plus de plaisir à parcourir le code que vous publiez....

Pour plus d'info je vous réoriente vars  la javadoc de Formatter




Aucun commentaire:

Enregistrer un commentaire

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.