Java 7 : Chaînes de caractères multilignes
Ça y est, c'est décidé, je me lance. Je vais enchaîner une petite série d'entrées qui auront pour sujet Java 7.
Mon objectif est assez simple : Rassembler le plus possible d'informations sur les fonctionnalités et améliorations proposées pour la version 7 de Java, les développer, et discuter des aspects techniques de celles-ci.
J'ai trouvé pas mal d'informations chez Alex Miller. Il semblerais qu'une petite synthèse aie déjà été faite. Je vais donc essayer de développer un peu plus toutes ces fonctionnalités.
La première amélioration que j'aimerais traiter aujourd'hui est l'apparition des chaînes de caractères multi-lignes.
L'idée originale est de Stephen Colebourne. Comme il l'a justifié sur son blog, beaucoup de langages disposent de cette fonctionnalité, et il serait intéressant de l'intégrer à Java.
Même si la fonctionnalité en elle même fait plus ou moins l'unanimité (ou pas), la question de la syntaxe reste encore ouverte.
La syntaxe originalement proposée par Stephen sur son blog est inspirée de Scala et de Groovy. Il s'agirait de tripler le caractère
L'avantage de cette syntaxe serait de permettre aussi d'éviter l'échappement des caractères
Stephen évoque également un problème au niveau de cette syntaxe, particulièrement vis-à-vis de l'indentation du code. Tous les caractères étant inclus, il faudrait supprimer les caractères d'indentation pour ne pas les retrouver dans la chaîne de caractères produite :
Une des solutions apportées consisterait en une nouvelle méthode de la classe
Plusieurs solutions ont été proposées dans les commentaires, mélangeant
Personnellement, je pense qu'une telle fonctionnalité mérite d'être considérée, mais je ne pense pas que les chaînes de caractères multi-lignes soient suffisamment importantes pour bénéficier d'une modification directe du langage. À mon humble avis, une méthode supplémentaire dans la classe String serait suffisante :
Il suffirait ensuite d'appeler cette méthode pour former une nouvelle chaîne de caractères multi-lignes :
Cela permettrait de gérer les chaînes de caractères avec des espaces avant et/ou après la ligne à ajouter, résoudrait les problèmes d'indentation, et tout ça, sans modifier la syntaxe actuelle du langage.
Une autre solution, à mon avis, serait d'utiliser un système à la PHP (système Heredoc). Ce système à l'avantage de laisser le choix au développeur des balises à employer pour délimiter sa chaîne de caractères multi-lignes. Et donc d'éviter au développeur l'échappement des caractères délimitant les chaînes. J'immagine donc bien un système ainsi formé :
Mon objectif est assez simple : Rassembler le plus possible d'informations sur les fonctionnalités et améliorations proposées pour la version 7 de Java, les développer, et discuter des aspects techniques de celles-ci.
J'ai trouvé pas mal d'informations chez Alex Miller. Il semblerais qu'une petite synthèse aie déjà été faite. Je vais donc essayer de développer un peu plus toutes ces fonctionnalités.
La première amélioration que j'aimerais traiter aujourd'hui est l'apparition des chaînes de caractères multi-lignes.
L'idée originale est de Stephen Colebourne. Comme il l'a justifié sur son blog, beaucoup de langages disposent de cette fonctionnalité, et il serait intéressant de l'intégrer à Java.
Même si la fonctionnalité en elle même fait plus ou moins l'unanimité (ou pas), la question de la syntaxe reste encore ouverte.
La syntaxe originalement proposée par Stephen sur son blog est inspirée de Scala et de Groovy. Il s'agirait de tripler le caractère
" ouvrant et fermant les chaînes de caractères. On se rapprocherait donc d'une syntaxe comme celle-ci :
String s = """This string
is a multi-line
String""";
L'avantage de cette syntaxe serait de permettre aussi d'éviter l'échappement des caractères
". Un rapide exemple :
String s = """Hello world, my name is "Vivien".""";
Stephen évoque également un problème au niveau de cette syntaxe, particulièrement vis-à-vis de l'indentation du code. Tous les caractères étant inclus, il faudrait supprimer les caractères d'indentation pour ne pas les retrouver dans la chaîne de caractères produite :
public class StringMaker { public static String getString() { return (""" This is my String"""); } }On y perd donc toute notion de code "bien indenté".
Une des solutions apportées consisterait en une nouvelle méthode de la classe
String, qui permettrait d'appliquer un trim() sur chaque ligne de la chaîne de caractères. Avec un code final ressemblant à celui-ci :
public class StringMaker { public static String getString() { return (""" This is my String""".trimLines()); } }Le problème vient ici de la gestion des performances. Appliquer un trim sur chaque ligne n'est pas la meilleure solution en terme de temps CPU, et les applications risquent de devenir très lourdes.
Plusieurs solutions ont été proposées dans les commentaires, mélangeant
", """ et autres <<" avant les chaînes ou après les chaînes, avec à chaque fois des significations différentesPersonnellement, je pense qu'une telle fonctionnalité mérite d'être considérée, mais je ne pense pas que les chaînes de caractères multi-lignes soient suffisamment importantes pour bénéficier d'une modification directe du langage. À mon humble avis, une méthode supplémentaire dans la classe String serait suffisante :
public static String toMultiLine(String... lines) { StringBuffer multiLine = new StringBuffer(); boolean firstLine = true; for (String line : lines) { if (!firstLine) multiLine.append(System.getProperty("line.separator")); else firstLine = false; multiLine.append(line); } return (multiLine.toString()); }
Il suffirait ensuite d'appeler cette méthode pour former une nouvelle chaîne de caractères multi-lignes :
String.toMultiLine("This", "is", "my", "line");
Cela permettrait de gérer les chaînes de caractères avec des espaces avant et/ou après la ligne à ajouter, résoudrait les problèmes d'indentation, et tout ça, sans modifier la syntaxe actuelle du langage.
Une autre solution, à mon avis, serait d'utiliser un système à la PHP (système Heredoc). Ce système à l'avantage de laisser le choix au développeur des balises à employer pour délimiter sa chaîne de caractères multi-lignes. Et donc d'éviter au développeur l'échappement des caractères délimitant les chaînes. J'immagine donc bien un système ainsi formé :
String s = <<<DELIM
This
is
my
string
DELIM;