Blocchi di Testo in Java

Concetti Chiave
  • I blocchi di testo in Java semplificano la gestione delle stringhe multi-linea, eliminando la necessità di sequenze di escape per nuove righe e virgolette doppie.
  • I blocchi di testo preservano l'indentazione e i caratteri di nuova riga, migliorando la leggibilità del codice.
  • Le nuove sequenze di escape come \s e \ per la continuazione di riga offrono maggiore flessibilità nella definizione delle stringhe.
  • I blocchi di testo sono supportati a partire da JDK 15, quindi è necessario utilizzare una versione recente di Java per sfruttare questa funzionalità.

I Blocchi di Testo

A partire da JDK 15, Java fornisce supporto per i blocchi di testo.

Un blocco di testo è un nuovo tipo di letterale che è composto da una sequenza di caratteri che può occupare più di una riga. Un blocco di testo riduce la noia che i programmatori spesso affrontano quando creano lunghi letterali stringa perché i caratteri di nuova riga possono essere utilizzati in un blocco di testo senza la necessità della sequenza di escape \n. Inoltre, i caratteri di tabulazione e virgolette doppie possono anche essere inseriti direttamente, senza utilizzare una sequenza di escape, e l'indentazione di una stringa multi-linea può essere preservata. Sebbene i blocchi di testo possano, inizialmente, sembrare un'aggiunta relativamente di poco conto a Java, essi sono diventati una delle caratteristiche più popolari.

Fondamenti dei Blocchi di Testo

Un blocco di testo è supportato da un nuovo delimitatore, che consiste in tre caratteri di virgolette doppie: """.

Un blocco di testo viene creato racchiudendo una stringa all'interno di un insieme di questi delimitatori. Specificatamente, un blocco di testo inizia immediatamente dopo il carattere di nuova riga che segue l'apertura """. Pertanto, la riga contenente il delimitatore di apertura deve terminare con un carattere di nuova riga. Il blocco di testo inizia sulla riga successiva. Un blocco di testo termina al primo carattere della chiusura """. Ecco un semplice esempio:

"""
I blocchi di testo rendono
facili le righe multiple.
"""

Questo esempio crea una stringa in cui la riga "I blocchi di testo rendono" è separata da "facili le righe multiple." da un carattere di nuova riga. Non è necessario utilizzare la sequenza di escape \n per ottenere il carattere di nuova riga. Pertanto, il blocco di testo preserva automaticamente i caratteri di nuova riga nel testo. Inoltre, il blocco di testo inizia dopo il carattere di nuova riga che segue il delimitatore di apertura e termina all'inizio del delimitatore di chiusura. Pertanto, anche il carattere di nuova riga dopo la seconda riga viene preservato.

È importante enfatizzare che anche se un blocco di testo utilizza il delimitatore """, esso è di tipo String. Pertanto, il blocco di testo precedente potrebbe essere assegnato a una variabile String, come mostrato qui:

String str = """
I blocchi di testo rendono
facili le righe multiple.
""";

Quando str viene stampato utilizzando questa istruzione:

System.out.println(str);

viene visualizzato quanto segue:

I blocchi di testo rendono
facili le righe multiple.

Si noti qualcos'altro riguardo a questo esempio. Poiché l'ultima riga termina con un carattere di nuova riga, quel carattere di nuova riga sarà anche nella stringa risultante. Se non si desidera un carattere di nuova riga finale, allora bisogna mettere il delimitatore di chiusura alla fine dell'ultima riga, come questo:

String str = """
I blocchi di testo rendono
facili le righe multiple.""";

Spazi Bianchi Iniziali in un Blocco di Testo

Nell'esempio precedente, il testo nel blocco era posizionato allineato a sinistra. Tuttavia, questo non è obbligatorio. È possibile avere spazi bianchi iniziali in un blocco di testo. Ci sono due ragioni principali per cui si potrebbe volere inserire spazi bianchi iniziali. Primo, permetterà al testo di essere meglio allineato con il livello di indentazione del codice circostante. Secondo, supporta uno o più livelli di indentazione all'interno del blocco di testo stesso.

In generale, gli spazi bianchi iniziali in un blocco di testo vengono automaticamente rimossi. Tuttavia, il numero di spazi bianchi iniziali da rimuovere da ogni riga è determinato dal numero di spazi bianchi iniziali nella riga con la minore indentazione. Ad esempio, se tutte le righe sono allineate a sinistra, allora nessuno spazio bianco viene rimosso. Se tutte le righe sono indentate di due spazi, allora due spazi vengono rimossi da ogni riga. Tuttavia, se una riga è indentata di due spazi, la successiva di quattro spazi, e la terza di sei spazi, allora solo due spazi vengono rimossi dall'inizio di ogni riga. Questo rimuove lo spazio iniziale indesiderato preservando l'indentazione del testo all'interno del blocco. Questo meccanismo è illustrato dal seguente programma:

// Dimostra l'indentazione in un blocco di testo.
class DemoBloccoTesto { 

    public static void main(String[] args) { 

        String str = """
            Nel mezzo del cammin di nostra vita
            mi ritrovai in una selva oscura,
            ché la diritta via era smarrita.
            Ahi quanto a dir qual era è cosa dura
            esta selva selvaggia e aspra e forte,
            che nel pensier rinova la paura!
            """;
        System.out.println(str);
    }

}

Questo programma produce il seguente output:

Nel mezzo del cammin di nostra vita
mi ritrovai in una selva oscura,
ché la diritta via era smarrita.
Ahi quanto a dir qual era è cosa dura
esta selva selvaggia e aspra e forte,
che nel pensier rinova la paura!

Come si può vedere, gli spazi bianchi iniziali sono stati rimossi fino a, ma non oltre, il livello delle righe più a sinistra. Quindi, il blocco di testo può essere indentato nel programma per adattarsi meglio al livello di indentazione del codice, con gli spazi bianchi iniziali rimossi quando la stringa viene creata. Tuttavia, qualsiasi spazio bianco dopo il livello di indentazione del blocco viene preservato.

Un altro punto chiave: Il delimitatore """ di chiusura partecipa nel determinare la quantità di spazio bianco da rimuovere perché anch'esso può impostare il livello di indentazione. Quindi, se il delimitatore di chiusura è allineato a sinistra, nessuno spazio bianco viene rimosso. Altrimenti, lo spazio bianco viene rimosso fino al primo carattere di testo o quando il delimitatore di chiusura viene incontrato. Ad esempio, si consideri questa sequenza:

String str = """
     A
         B
     C
"""; // questo determinerà l'inizio dell'indentazione

String str2 = """
     A
         B
     C
      """; // questo non ha effetto

String str3 = """
     A
         B
     C
   """; // questo rimuove i primi tre spazi bianchi da ogni riga

System.out.print(str);
System.out.print(str2);
System.out.print(str3);

Questa sequenza visualizza quanto segue:

     A
         B
     C
A
    B
C
  A
      B
  C

Si presti particolare attenzione al posizionamento del delimitatore di chiusura per str2. Poiché il numero di spazi precedenti per le righe contenenti A e C sono minori di quello che precede le """, il delimitatore di chiusura non ha effetto sul numero di spazi rimossi.

Usare le Virgolette Doppie in un Blocco di Testo

Un altro grande vantaggio dei blocchi di testo è la capacità di usare le virgolette doppie senza la necessità della sequenza di escape \". In un blocco di testo, le virgolette doppie vengono trattate come qualsiasi altro carattere. Ad esempio, consideriamo il seguente programma:

// Usare le virgolette doppie in un blocco di testo.
class DemoBloccoDiTesto2 {

    public static void main(String[] args) {

        String str = """
            Lui disse, "Il gatto è sul tetto."
            Lei chiese, "Come è arrivato lassù?"
            """;

        System.out.println(str);
    }

}

L'output è mostrato qui:

Lui disse, "Il gatto è sul tetto."
Lei chiese, "Come è arrivato lassù?"

Come si può vedere, non c'è bisogno di usare la sequenza di escape \". Inoltre, poiché le virgolette doppie vengono trattate come caratteri "normali", non c'è nemmeno bisogno che siano bilanciate all'interno di un blocco di testo. Ad esempio

""" ""x"  """;

è perfettamente accettabile. Bisogna solo ricordare semplicemente che tre virgolette doppie come unità definiscono il delimitatore del blocco di testo.

Sequenze di Escape nei Blocchi di Testo

Le sequenze di escape, come \n o \t, possono essere utilizzate in un blocco di testo. Tuttavia, poiché le virgolette doppie, le nuove righe e le tabulazioni possono essere inserite direttamente, non saranno spesso necessarie. Detto questo, con l'aggiunta dei blocchi di testo, due nuove sequenze di escape sono state aggiunte a Java. La prima è \s, che specifica uno spazio. Pertanto, può essere utilizzata per indicare spazi finali. La seconda è la sequenza fine di riga, ossia \ seguita da un terminatore di riga. Poiché la \ deve essere seguita da un terminatore di riga, deve essere utilizzata solo alla fine della riga. In un blocco di testo, la \ impedisce che un carattere di nuova riga venga incluso alla fine della sua riga. Pertanto, la \ è essenzialmente un indicatore di continuazione di riga. Ad esempio,

String str = """
             uno \
             due
             tre \
             quattro
             """;
System.out.println(str);

Poiché la nuova riga è soppressa dopo uno e tre, l'output sarà come mostrato qui:

uno due
tre quattro

È importante sottolineare che questa sequenza di escape può essere utilizzata solo in un blocco di testo. Non può essere utilizzata per continuare un letterale stringa tradizionale, ad esempio.