Java Text Blocks
Scrivi letterali string multi-riga in Java con i text block (stringhe con triple virgolette).
Un text block è un letterale stringa multi-riga che ti risparmia il disordine di newline escaped e concatenazioni. Introdotto come anteprima in Java 13 e reso definitivo in Java 15, ti permette di incollare HTML, JSON, SQL o qualsiasi blocco di testo formattato direttamente nel sorgente, rendendolo leggibile come l'originale.
Prima dei text block, poche righe di markup incorporato significavano una muraglia di escape \n e operatori +. Un text block si apre con tre virgolette doppie (""") seguite da un'interruzione di riga, e tutto ciò che precede la chiusura """ diventa la stringa — con gli spazi iniziali gestiti in modo intelligente.
La Sintassi con Triple Virgolette
Un text block inizia con """ e un terminatore di riga. Il contenuto inizia sulla riga successiva; il delimitatore di apertura non può condividere la riga con del testo. Il blocco termina con un altro """.
// Old way: escapes and concatenation
String json = "{\n" +
" \"name\": \"Ada\"\n" +
"}";
// Text block: paste it as-is
String block = """
{
"name": "Ada"
}
""";String s = """{. Il """ di apertura deve essere seguito immediatamente da un terminatore di riga — solo il """ di chiusura può condividere la riga con del testo.I due producono stringhe quasi identiche, ma il text block è leggibile a colpo d'occhio e le virgolette doppie incorporate non richiedono escape. Un text block è una String come qualsiasi altra — non esiste un tipo separato — quindi ogni metodo di String funziona su di esso, e un text block è comunque immutabile una volta creato.
Spazio Bianco Incidentale vs Essenziale
Il compilatore distingue lo spazio bianco incidentale (indentazione aggiunta solo per mantenere il sorgente ordinato) dallo spazio bianco essenziale (indentazione che si vuole effettivamente nel valore). Trova la riga con il minor numero di spazi iniziali — inclusa la riga del """ di chiusura — e rimuove quella quantità comune da ogni riga.
String html = """
<p>Hi</p>
""";
// The closing """ is indented 4 spaces, the <p> 8 spaces.
// Common minimum is 4, so the result keeps 4 leading spaces: " <p>Hi</p>\n"Spostare il delimitatore di chiusura cambia la quantità rimossa. Mettere """ tutto a sinistra non rimuove alcuna indentazione; metterlo sotto la riga più indentata le rimuove tutte. Questo ti dà un controllo preciso senza contare gli spazi a mano.
Escape e il Newline Finale
I text block supportano le solite sequenze di escape, più due che esistono solo per loro:
| Escape | Effetto |
|---|---|
\n, \t, \" | Escape standard, ancora validi |
\ (fine riga) | Continuazione di riga — sopprime il newline che seguirebbe |
\s | Un singolo spazio che non viene mai rimosso come spazio bianco incidentale |
Un text block il cui contenuto termina su una riga propria include un newline finale; posizionare il """ di chiusura sulla stessa riga dell'ultimo testo lo omette.
String withNewline = """
last line
"""; // ends with "\n"
String noNewline = """
last line"""; // no trailing newlineCasi d'Uso Comuni
I text block eccellono ovunque nel codice compaia testo formattato e multi-riga:
// SQL kept readable instead of one long escaped string
String query = """
SELECT id, name, price
FROM products
WHERE price < ?
ORDER BY name
""";
// JSON payload with quotes that need no escaping
String payload = """
{
"user": "ada",
"roles": ["admin", "editor"]
}
""";Poiché il testo rispecchia la sua forma finale, copiare e incollare uno snippet da un file .sql o .json funziona senza modifiche, e i revisori possono individuare immediatamente gli errori di formattazione.
I Text Block in Azione
L'esempio seguente esercita ogni funzionalità: rimozione dello spazio bianco incidentale, formatted() per i segnaposto, lo stream lines(), gli escape \s e \ a fine riga, l'indentazione controllata dal delimitatore e le virgolette doppie incorporate senza escape. Leggi i commenti — ogni riga corrisponde a una regola precedente.
Cosa ricavare dall'esecuzione:
- Il blocco grezzo stampa
<html>allineato al margine sinistro anche se era indentato nel sorgente, perché lo spazio bianco incidentale comune è stato rimosso in relazione al"""di chiusura. formatted("World")sostituisce il segnaposto%s, dimostrando che un text block è unaStringordinaria che puoi passare ai metodi di formattazione.Line count: 5proviene dahtml.lines()che trasmette le cinque righe di contenuto; il newline finale aggiunto dal"""di chiusura su riga propria termina l'ultima riga invece di creare una sesta riga vuota.Has trailing space: truemostra che\sha forzato uno spazio a sopravvivere che il compilatore avrebbe altrimenti rimosso come incidentale.Continuation: Roses are red, violets are blue.dimostra che un\a fine riga ha unito le due righe sorgente in una, e{"name": "Ada", "active": true}è stato stampato senza nemmeno un escape per le virgolette.