编程知识 cdmana.com

Mise à jour vers Java 17: blocs de texte

Tout ce temps,Java Il n'y a pas de bonne façon dans la langue d'ajouter des constantes de chaîne multilignes directement dans le Code.

Une pratique courante est d'utiliser une connexion à chaîne.Chaque chaîne représente une ligne,Un saut de ligne doit être ajouté manuellement.Le problème avec les connexions de chaînes est qu'elles sont difficiles à entretenir.En particulier, les guillemets doubles doivent être échappés.Dans certains formats,Par exemple, YAML,La position des caractères blancs affecte la sémantique.Lors de l'utilisation d'une connexion à chaîne,Il est difficile d'assurer efficacement l'exactitude du format.

public class StringTemplate {

public String generate(User user) {
return "<user>\n"
+ " <id>" + user.id() + "</id>\n"
+ " <name>" + user.name() + "</name>\n"
+ " <email>" + user.email() + "</email>\n"
+ "</user>";
}
}

Une autre approche consiste à enregistrer des chaînes multilignes dans un fichier,Lire à l'exécution.Cette approche nécessite un code supplémentaire pour.

Lorsque les blocs de texte sont pris en charge dans d'autres langues dominantes,Java Enfin, le soutien correspondant a été fourni.Les blocs de texte sont Java 12 Introduit sous forme de fonction d'aperçu,In Java 13 Prévisualiser à nouveau,In Java 14 Devenir une fonction formelle.

Bloc de texte

Utilisation de blocs de texte3 Deux guillemets pour séparer . Les guillemets doubles dans les blocs de texte n'ont pas besoin d'être échappés . Les sauts de ligne sont conservés .

public class SimpleTextBlocks {

private static final String BLOCK1 = """
<user>
<id>001</id>
<name>alex</name>
<email>[email protected]</email>
</user>
"""
;

private static final String BLOCK2 = """
{
"id": "001",
"name": "alex",
"email": "[email protected]"
}
"""
;
}

Les blocs de texte sont entièrement traités par le compilateur .Au moment de l'exécution, Le bloc de texte n'est pas différent d'une chaîne de caractères ordinaire à une seule ligne .

Le compilateur passe 3 Étapes pour traiter les blocs de texte .

  • La première étape consiste à convertir uniformément les sauts de ligne spécifiques au système d'exploitation en  LF.CR Et CRLF  Sont convertis en  LF.

  • La deuxième étape consiste à supprimer les caractères blancs utilisés comme tirets .

  • La dernière étape consiste à traiter les caractères d'évasion .

Traitement des caractères blancs indentés

Les caractères blancs dans les blocs de texte peuvent améliorer la lisibilité du Code , Même avoir un impact sémantique . Lorsque des blocs de texte sont intégrés dans JavaDans le Code, L'indentation du contenu doit correspondre à JavaFormat du Code.

Dans le code suivant, Les tirets des première et cinquième lignes du bloc de texte sont 6Espaces, Et l'indentation des autres lignes est 8Espaces.

public class Indentation {

private static final String BLOCK = """
<user>
<id>001</id>
<name>alex</name>
<email>[email protected]</email>
</user>
"""
;
}

Pour toutes les lignes ,Oui.6 L'indentation des espaces est due à Java Produit par le format du Code . Le contenu réel du bloc de texte doit être le suivant . Pour ce faire, il faut supprimer certains espaces du bloc de texte .

<user>
<id>001</id>
<name>alex</name>
<email>[email protected]</email>
</user>

.Le caractère blanc du suffixe est automatiquement supprimé pour chaque ligne du bloc de texte . Alors que les préfixes blancs utilisent des algorithmes spécifiques pour supprimer . Cet algorithme est très simple , Il n'y a que deux règles .

  • La première règle est de supprimer de chaque ligne Même quantité Caractère blanc de .

  • La deuxième règle est que le nombre de caractères blancs supprimés est le nombre de caractères blancs préfixés pour toutes les lignes Minimum.

Retour à l'exemple du bloc de texte précédent , Le nombre minimum de caractères blancs préfixés pour toutes les lignes est 6, Donc chaque ligne est supprimée 6 Préfixe caractères , Pour obtenir les résultats réellement nécessaires .

Notez les lignes vides qui apparaissent à la fin du bloc de texte . L'indentation de cette ligne vide affecte le résultat final du traitement .

Dans le code suivant, Les lignes vides à la fin sont 6Espaces, Est le plus petit de toutes les lignes . Les caractères blancs qui ont été supprimés sont donc 6- Oui.. Le tiret de la première ligne du résultat obtenu est 4Caractères.

public class Indentation2 {

private static final String BLOCK = """
<user>
<id>001</id>
<name>alex</name>
<email>[email protected]</email>
</user>
"""
;
}


Séquence d'évasion

Toutes les séquences d'évasion supportées par les constantes de chaîne peuvent être utilisées dans les blocs de texte .En plus de ça,, Deux nouvelles séquences d'évasion ont également été ajoutées .

La première séquence d'évasion est  \  Ajouter un saut de ligne après , Utilisé pour empêcher l'insertion d'un saut de ligne . Peut être utilisé pour générer de longues chaînes à une seule ligne .Dans le code suivant LONG_STRING  Il n'y a pas de nouvelle ligne .

public class LongString {

private static final String LONG_STRING = """
This a very long string. \
This string continues. \
The last part of this string. \
""";
}

La deuxième séquence d'évasion est  \s, Représente un espace . Le formatage peut être facilité dans les blocs de texte . Vous pouvez ajouter  \s,Alors \s  Les caractères blancs précédents sont conservés ,Et \s  Les caractères blancs suivants sont supprimés . La longueur de chaque ligne du bloc de texte dans le code suivant est 11.

public class KeepWhiteSpace {

private static final String BLOCK = """
alex: 1\s
bob: 12\s
david: 100\s
"""
;
}


String Une nouvelle approche

String Ajouter3Nouvelles approches.

stripIndent()  Pour supprimer les caractères blancs en tirets , .Implémente l'algorithme de suppression d'indentation décrit précédemment lorsque le compilateur traite des blocs de texte .

translateEscapes()  Le but est de traiter les séquences d'évasion dans une chaîne .

formatted()  Le rôle de  String  L'objet est formaté comme modèle .

Le code suivant montre  formatted Utilisation de la méthode.

public class FormatStrings {

public String format(User user) {
return """
<user>
<id>%s</id>
<name>%s</name>
<email>%s</email>
</user>
"""
.formatted(user.id(), user.name(), user.email());
}

À propos des blocs de texte ,Juste ici..Voir ma vidéo correspondanteBStation.



Pousse mon nouveau livre.《QuarkusDéveloppement de microservices natifs en nuage》, Jingdong Taobao peut rechercher le titre du livre .


版权声明
本文为[Code flexible]所创,转载请带上原文链接,感谢
https://cdmana.com/2021/10/20211013231241887s.html

Scroll to Top