Menyisipkan satu cuplikan JSON atau SQL ke dalam kode Java klasik adalah latihan kesabaran: setiap baris harus diakhiri \n, setiap tanda kutip ganda di-escape jadi \", dan seluruh potongan dirantai dengan operator +. Hasilnya valid, tetapi tidak ada yang mirip teks aslinya — pembaca harus menyusun ulang string itu di kepala untuk membayangkan bentuk akhirnya. Text block, difinalkan di Java 15 melalui JEP 378 (preview sejak JEP 355), menyediakan literal string multi-baris yang ditulis apa adanya di antara pembuka """ dan penutup """. Chapter ini membahas aturan lekukan yang menentukan hasil akhir, escape yang tetap berlaku, dan pola template dengan formatted().

Aturan Lekukan Minimal #

Text block menghapus incidental whitespace secara otomatis: compiler menghitung lekukan minimum yang dimiliki bersama oleh seluruh baris (termasuk baris penutup """), lalu membuang lekukan sebesar itu dari tiap baris. Konsekuensinya penting: posisi penutup """ ikut menentukan hasil. Bila penutup digeser ke kanan, batas pembuang bertambah dan isi bergeser ke kiri; bila penutup diletakkan di kolom paling kiri dari seluruh isi, seluruh lekukan bermakna tetap utuh. Baris kosong dan baris berisi spasi saja tidak ikut menghitung lekukan minimum tersebut.

Program teruji berikut menyusun empat kasus umum sekaligus: cuplikan JSON, surat ber-template, baris panjang yang disambung, dan spasi ujung baris yang dijaga:

java TeksBersih.java
public class TeksBersih {

    public static void main(String[] args) {
        // 1) JSON multi-baris tanpa konkatenasi dan tanpa \n manual.
        var profil = """
                {
                  "nama": "Budi Santoso",
                  "email": "[email protected]",
                  "peran": ["admin", "editor"],
                  "aktif": true
                }
                """;
        System.out.println(profil);

        // 2) Template dengan formatted(): dua placeholder diisi runtime.
        var surat = """
                Halo %s,
                pesanan %d sudah kami kirim.
                Terima kasih.""".formatted("Siti", 1729);
        System.out.println(surat);
        System.out.println("panjang surat: " + surat.length() + " karakter");

        // 3) Baris disambung dengan backslash: satu baris logis.
        var alamat = """
                Jalan Merdeka No. \
                45, Jakarta Pusat""";
        System.out.println(alamat);

        // 4) Escape \s menjaga spasi di ujung baris tetap ada.
        var tabel = """
                nama \s kolom\s
                ---- \s ----\s""";
        System.out.println("[" + tabel + "]");
    }
}

Output yang Dihasilkan:

text
{
  "nama": "Budi Santoso",
  "email": "[email protected]",
  "peran": ["admin", "editor"],
  "aktif": true
}

Halo Siti,
pesanan 1729 sudah kami kirim.
Terima kasih.
panjang surat: 55 karakter
Jalan Merdeka No. 45, Jakarta Pusat
[nama   kolom 
----   ---- ]

Bedah baris-per-baris untuk bagian pentingnya:

  1. Blok var profil = """...""": isi JSON ditulis apa adanya; lekukan dua spasi di dalam blok terjaga karena penutup """ berada di kolom yang sama dengan kata var, yaitu lebih kiri daripada seluruh isi.
  2. Blok var surat = """...""".formatted("Siti", 1729): text block adalah String biasa, sehingga method formatted() dari String dapat langsung mengisi placeholder %s dan %d saat runtime.
  3. Baris Jalan Merdeka No. \: backslash di ujung baris menyambung baris berikutnya tanpa menyisakan spasi atau \n — hasilnya satu baris logis Jalan Merdeka No. 45, Jakarta Pusat.
  4. Escape \s di blok terakhir: satu spasi tunggal di ujung baris akan dibuang sebagai lekukan insidental; \s mewakili spasi yang dipertahankan, terlihat dari spasi sebelum ] pada output.

Escape yang Tetap Berlaku #

Text block bukan raw string: urutan escape tetap diproses seperti string biasa. Tanda kutip ganda di dalam isi tidak perlu di-escape — itulah guna utamanya — tetapi escape lain tetap bekerja:

EscapeFungsi dalam text block
\"Tanda kutip ganda (jarang diperlukan lagi)
\n, \tKontrol karakter seperti biasa
\sSpasi yang dipertahankan di ujung baris
\ di akhir barisMenyambung baris berikutnya tanpa pemisah
\\Backslash literal

Dengan string multi-baris beres, data bertipe sederhana pun berikutnya mendapat bentuk khusus: record memungkinkan satu baris kode menjadi class data lengkap.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

TeksBersih.java

Unduh berkas
java
public class TeksBersih {

    public static void main(String[] args) {
        // 1) JSON multi-baris tanpa konkatenasi dan tanpa \n manual.
        var profil = """
                {
                  "nama": "Budi Santoso",
                  "email": "[email protected]",
                  "peran": ["admin", "editor"],
                  "aktif": true
                }
                """;
        System.out.println(profil);

        // 2) Template dengan formatted(): dua placeholder diisi runtime.
        var surat = """
                Halo %s,
                pesanan %d sudah kami kirim.
                Terima kasih.""".formatted("Siti", 1729);
        System.out.println(surat);
        System.out.println("panjang surat: " + surat.length() + " karakter");

        // 3) Baris disambung dengan backslash: satu baris logis.
        var alamat = """
                Jalan Merdeka No. \
                45, Jakarta Pusat""";
        System.out.println(alamat);

        // 4) Escape \s menjaga spasi di ujung baris tetap ada.
        var tabel = """
                nama \s kolom\s
                ---- \s ----\s""";
        System.out.println("[" + tabel + "]");
    }
}