Venant de Perl, il me manque certainement le moyen "ici-document" de créer une chaîne multi-lignes dans le code source:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
En Java, je dois avoir des guillemets encombrants et des signes plus sur chaque ligne pendant que je concatène ma chaîne multiligne à partir de zéro.
Quelles sont les meilleures alternatives? Définir ma chaîne dans un fichier de propriétés?
Edit : Deux réponses disent que StringBuilder.append () est préférable à la notation plus. Quelqu'un pourrait-il expliquer pourquoi ils le pensent? Cela ne me semble pas du tout préférable. Je cherche un moyen de contourner le fait que les chaînes multilignes ne sont pas une construction de langage de première classe, ce qui signifie que je ne veux certainement pas remplacer une construction de langage de première classe (concaténation de chaînes avec plus) par des appels de méthode.
Edit : Pour clarifier davantage ma question, je ne suis pas du tout préoccupé par les performances. Je suis préoccupé par les problèmes de maintenabilité et de conception.
string1 + string2
vous allouez un nouvel objet chaîne et copiez les caractères des deux chaînes d'entrée. Si vous ajoutez n chaînes ensemble, vous feriez n-1 allocations et environ (n ^ 2) / 2 copies de caractères. StringBuilder, en revanche, copie et réaffecte moins fréquemment (bien qu'il fasse toujours les deux lorsque vous dépassez la taille de son tampon interne). Théoriquement, il y a des cas où le compilateur pourrait convertir + pour utiliser StringBuilder mais en pratique qui sait.Réponses:
Stephen Colebourne a créé une proposition pour ajouter des chaînes multilignes dans Java 7.
De plus, Groovy prend déjà en charge les chaînes multi-lignes .
la source
Il semble que vous souhaitiez créer un littéral multiligne, qui n'existe pas en Java.
Votre meilleure alternative va être des cordes qui sont juste
+
ensemble. Certaines autres options que les gens ont mentionnées (StringBuilder, String.format, String.join) ne seraient préférables que si vous commenciez avec un tableau de chaînes.Considère ceci:
Versus
StringBuilder
:Versus
String.format()
:Versus Java8
String.join()
:Si vous voulez la nouvelle ligne pour votre système particulier, vous devez soit utiliser
System.lineSeparator()
, soit utiliser%n
dansString.format
.Une autre option consiste à placer la ressource dans un fichier texte et à lire simplement le contenu de ce fichier. Ce serait préférable pour les très grandes chaînes pour éviter de gonfler inutilement vos fichiers de classe.
la source
String.format
version est que vous devez synchroniser le format avec le nombre de lignes.Dans Eclipse, si vous activez l'option "Échapper le texte lors du collage dans un littéral de chaîne" (dans Préférences> Java> Éditeur> Saisie) et collez une chaîne à plusieurs lignes avec des guillemets, elle ajoutera automatiquement
"
et\n" +
pour toutes vos lignes.la source
\r
s qu'Eclipse met sous Windows?C'est un vieux fil, mais une nouvelle solution assez élégante (avec seulement 4 peut-être 3 petits inconvénients) consiste à utiliser une annotation personnalisée.
Vérifier: http://www.adrianwalker.org/2011/12/java-multiline-string.html
Un projet inspiré de ce travail est hébergé sur GitHub:
https://github.com/benelog/multiline
Exemple de code Java:
Les inconvénients sont
<%= variable %>
) :-)Et vous devrez probablement configurer Eclipse / Intellij-Idea pour ne pas reformater automatiquement vos commentaires Javadoc.
On peut trouver cela bizarre (les commentaires Javadoc ne sont pas conçus pour incorporer autre chose que des commentaires), mais comme ce manque de chaîne multiligne en Java est vraiment ennuyeux au final, je trouve que c'est la moins mauvaise solution.
la source
Une autre option peut être de stocker de longues chaînes dans un fichier externe et de lire le fichier dans une chaîne.
la source
@
syntaxe de C # est beaucoup plus propre.C'est quelque chose que vous ne devriez jamais utiliser sans penser à ce qu'il fait. Mais pour des scripts uniques, j'ai utilisé cela avec beaucoup de succès:
Exemple:
Code:
la source
String.join
Java 8 a ajouté une nouvelle méthode statique à
java.lang.String
laquelle offre une alternative légèrement meilleure:String.join( CharSequence delimiter , CharSequence... elements )
En l'utilisant:
la source
"\n"
n'est nécessaire, et est conscient de la portabilité!JEP 355: Text Blocks (Preview) vise à couvrir cette fonctionnalité, il cible actuellement JDK 13 comme fonctionnalité d'aperçu. Permettre d'écrire quelque chose comme:
Avant ce JEP, dans JDK12, JEP 326: Raw String Literals visait à implémenter une fonctionnalité similaire, mais elle a finalement été retirée.
la source
Si vous définissez vos chaînes dans un fichier de propriétés, la situation sera bien pire. IIRC, cela ressemblera à:
En règle générale, il est raisonnable de ne pas intégrer de grandes chaînes dans la source. Vous voudrez peut-être les charger en tant que ressources, peut-être au format XML ou dans un format texte lisible. Les fichiers texte peuvent être lus au moment de l'exécution ou compilés dans la source Java. Si vous finissez par les placer dans la source, je suggère de mettre
+
le devant et d'omettre les nouvelles lignes inutiles:Si vous avez de nouvelles lignes, vous souhaiterez peut-être une méthode de jointure ou de formatage:
la source
Les avantages sont convertis en StringBuilder.append, sauf lorsque les deux chaînes sont des constantes afin que le compilateur puisse les combiner au moment de la compilation. Du moins, c'est comme ça dans le compilateur de Sun, et je soupçonne que la plupart sinon tous les autres compilateurs feraient de même.
Donc:
génère normalement exactement le même code que:
D'autre part:
est le même que:
Autrement dit, il n'y a pas de pénalité à casser vos littéraux de chaîne sur plusieurs lignes avec des signes plus pour la lisibilité.
la source
Dans l'IDE IntelliJ, il vous suffit de taper:
Placez ensuite votre curseur à l'intérieur des guillemets et collez votre chaîne. L'IDE va l'étendre en plusieurs lignes concaténées.
la source
Malheureusement, Java n'a pas de littéraux de chaîne multi-lignes. Vous devez soit concaténer les littéraux de chaîne (en utilisant + ou StringBuilder étant les deux approches les plus courantes), soit lire la chaîne dans un fichier séparé.
Pour les grands littéraux de chaînes multi-lignes, je serais enclin à utiliser un fichier séparé et à le lire en utilisant
getResourceAsStream()
(une méthode de laClass
classe). Cela facilite la recherche du fichier car vous n'avez pas à vous soucier du répertoire actuel par rapport à l'emplacement d'installation de votre code. Cela facilite également l'empaquetage, car vous pouvez réellement stocker le fichier dans votre fichier jar.Supposons que vous soyez dans une classe appelée Foo. Faites juste quelque chose comme ça:
Un autre inconvénient est que Java n'a pas de méthode standard "lire tout le texte de ce Reader dans une chaîne". C'est assez facile à écrire cependant:
la source
Mais, la meilleure alternative est d'utiliser String.format
la source
Étant donné que Java ne prend pas (encore) en charge les chaînes multilignes en mode natif, le seul moyen pour l'instant est de le contourner à l'aide de l'une des techniques susmentionnées. J'ai construit le script Python suivant en utilisant certaines des astuces mentionnées ci-dessus:
Mettez cela dans un fichier nommé javastringify.py et votre chaîne dans un fichier mystring.txt et exécutez-le comme suit:
Vous pouvez ensuite copier la sortie et la coller dans votre éditeur.
Modifiez cela au besoin pour gérer tous les cas spéciaux, mais cela fonctionne pour mes besoins. J'espère que cela t'aides!
la source
Vous pouvez utiliser le code scala, qui est compatible avec java, et autorise les chaînes multilignes entourées de "" ":
(notez les guillemets à l'intérieur de la chaîne) et de java:
Que ce soit plus confortable ...?
Une autre approche, si vous manipulez souvent du texte long, qui doit être placé dans votre code source, pourrait être un script, qui prend le texte d'un fichier externe et l'enveloppe comme une chaîne java-multiligne comme ceci:
afin que vous puissiez le copier-coller facilement dans votre source.
la source
Vous pouvez concaténer vos ajouts dans une méthode distincte comme:
Dans tous les cas, préférez
StringBuilder
la notation plus.la source
En fait, ce qui suit est la mise en œuvre la plus propre que j'ai vue jusqu'à présent. Il utilise une annotation pour convertir un commentaire en une variable chaîne ...
Ainsi, le résultat final est que la variable html contient la chaîne multiligne. Pas de guillemets, pas d'avantages, pas de virgules, juste une chaîne pure.
Cette solution est disponible à l'URL suivante ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
J'espère que cela pourra aider!
la source
Voir Java Stringfier . Transforme votre texte en un bloc java StringBuilder s'échappant si nécessaire.
la source
la source
Une alternative que je n'ai pas encore vue comme réponse est la
java.io.PrintWriter
.De plus, le fait d'
java.io.BufferedWriter
avoir unenewLine()
méthode n'est pas mentionné.la source
Si vous aimez la goyave de Google autant que moi, cela peut donner une représentation assez nette et un moyen agréable et facile de ne pas coder en dur vos caractères de nouvelle ligne aussi:
la source
Utilisation
Properties.loadFromXML(InputStream)
. Il n'y a pas besoin de bibliothèques externes.Mieux qu'un code en désordre (puisque la maintenabilité et la conception sont votre préoccupation), il est préférable de ne pas utiliser de longues chaînes.
Commencez par lire les propriétés xml:
alors vous pouvez utiliser votre chaîne multiligne de manière plus maintenable ...
MultiLine.xml` se trouve dans le même dossier YourClass:
PS: Vous pouvez utiliser
<![CDATA["
..."]]>
pour une chaîne de type xml.la source
Avec JDK / 12 Early Access Build # 12 , on peut désormais utiliser des chaînes multilignes en Java comme suit:
et cela se traduit par la sortie suivante:
Edit: reporté à java 13
la source
Une solution assez efficace et indépendante de la plate-forme utiliserait la propriété système pour les séparateurs de lignes et la classe StringBuilder pour créer des chaînes:
la source
Une bonne option.
la source
Java 13 et au-delà
Les chaînes multilignes sont désormais prises en charge en Java via les blocs de texte . En Java 13 et 14, cette fonctionnalité nécessite que vous définissiez l'
––enable–preview
option lors de la création et de l'exécution de votre projet. Consultez cette documentation Java pour plus de détails.Maintenant, avant Java 13, voici comment vous écririez une requête:
Grâce aux blocs de texte Java 13, vous pouvez réécrire cette requête comme suit:
Beaucoup plus lisible, non?
Prise en charge IDE
IntelliJ IDEA prend en charge la transformation des
String
blocs de concaténation hérités au nouveauString
format multiligne :JSON, HTML, XML
La multiligne
String
est particulièrement utile lors de l'écriture de JSON, HTML ou XML.Considérez cet exemple en utilisant la
String
concaténation pour créer un littéral de chaîne JSON:Vous pouvez à peine lire le JSON en raison des caractères qui s'échappent et de l'abondance de guillemets doubles et de signes plus.
Avec Java Text Blocks, l'objet JSON peut être écrit comme ceci:
Depuis que j'ai utilisé C # en 2004, je voulais avoir cette fonctionnalité en Java, et maintenant nous l'avons enfin.
la source
Les chaînes multilignes ne sont pas autorisées dans les fichiers de propriétés. Vous pouvez utiliser \ n dans les fichiers de propriétés, mais je ne pense pas que ce soit une bonne solution dans votre cas.
la source
Je sais que c'est une vieille question, mais pour les développeurs intéressés, les littéraux multi-lignes seront en # Java12
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
la source
Je suggère d'utiliser un utilitaire tel que suggéré par ThomasP, puis de le lier à votre processus de construction. Un fichier externe est toujours présent pour contenir le texte, mais le fichier n'est pas lu au moment de l'exécution. Le workflow est alors:
class TextBlock {...
suivi d'une chaîne statique qui est générée automatiquement à partir du fichier de ressourcesla source
Lorsqu'une longue série de + est utilisée, un seul StringBuilder est créé, sauf si la chaîne est déterminée au moment de la compilation, auquel cas aucun StringBuilder n'est utilisé!
Le seul moment où StringBuilder est plus efficace est lorsque plusieurs instructions sont utilisées pour construire la chaîne.
Remarque: Un seul StringBuilder est créé.
Soyez aussi clair et simple que possible.
la source