Blok Teks Java

1. Perkenalan

Dalam tutorial sebelumnya, kita melihat bagaimana kita dapat menggunakan string multi-baris dalam versi Java apa pun dan tanpa mengaktifkan fitur pratinjau.

Dalam tutorial ini, kita akan melihat bagaimana menggunakan fitur pratinjau JDK 13/14 dari blok teks .

2. Penggunaan

Sejak Java 13, blok teks tersedia sebagai fitur pratinjau. Blok teks dimulai dengan "" (tiga tanda kutip ganda) diikuti oleh spasi opsional dan baris baru. Contoh paling sederhana bisa terlihat seperti:

String example = """ Example text""";

Perhatikan bahwa tipe hasil dari blok teks masih berupa String . Blok teks hanya memberi kita cara lain untuk menulis literal String di kode sumber kita.

Di dalam blok teks, kita dapat dengan bebas menggunakan baris dan tanda kutip baru tanpa perlu keluar . Ini memungkinkan kita untuk memasukkan fragmen literal HTML, JSON, SQL, atau apapun yang kita butuhkan, dengan cara yang lebih elegan dan mudah dibaca.

Dalam String yang dihasilkan , indentasi (base) dan baris baru pertama tidak disertakan. Kita akan melihat penyerahan lekukan di bagian selanjutnya.

3. Indentasi

Untungnya, saat menggunakan blok teks, kita masih bisa mengindentasi kode kita dengan benar. Untuk mencapai itu, bagian dari indentasi diperlakukan sebagai kode sumber sementara bagian lain dari indentasi dilihat sebagai bagian dari blok teks. Untuk membuat ini berfungsi, kompilator memeriksa indentasi minimum di semua baris yang tidak kosong. Selanjutnya, kompilator menggeser blok teks lengkap ke kiri.

Pertimbangkan blok teks yang berisi beberapa HTML:

public String getBlockOfHtml() { return """   example text  """; }

Dalam kasus ini, lekukan minimum adalah 12 spasi. Jadi, semua 12 spasi di sebelah kiridan pada semua baris berikutnya dihapus. Mari kita uji ini:

@Test void givenAnOldStyleMultilineString_whenComparing_thenEqualsTextBlock() { String expected = "\n" + "\n" + " \n" + " example text\n" + " \n" + ""; assertThat(subject.getBlockOfHtml()).isEqualTo(expected); } @Test void givenAnOldStyleString_whenComparing_thenEqualsTextBlock() { String expected = "\n\n \n example text\n \n"; assertThat(subject.getBlockOfHtml()) .isEqualTo(expected); }

Saat kita membutuhkan indentasi eksplisit , kita bisa menggunakan lebih sedikit indentasi untuk baris yang tidak kosong (atau baris terakhir):

public String getNonStandardIndent() { return """ Indent """; } @Test void givenAnIndentedString_thenMatchesIndentedOldStyle() { assertThat(subject.getNonStandardIndent()) .isEqualTo(" Indent\n"); }

Selain itu, kita juga dapat menggunakan pelolosan di dalam blok teks, seperti yang akan kita lihat di bagian selanjutnya.

4. Melarikan diri

Di dalam blok teks, tanda kutip ganda dan baris baru tidak harus di-escape. Namun, kita dapat menggunakan escaping untuk menambahkan, misalnya, carriage return ( \ r ) atau tab ( \ t ) ke blok teks. Kami bahkan dapat menggunakan "" lagi di blok teks kami dengan mengosongkan salah satu tanda kutip ganda:

public String getTextWithEscapes() { return """ fun with\n whitespace\t\r and other escapes \""" """; }

Ketahuilah bahwa karena tanda kutip ganda tunggal dan baris baru tidak harus di-escape, menghindarinya dianggap praktik yang buruk.

Juga, perhatikan bahwa meskipun file sumber memiliki akhiran baris Windows ( \ r \ n ), blok teks hanya akan diakhiri dengan baris baru ( \ n ) . Jika kita membutuhkan carriage return ( \ r ) untuk hadir, kita harus menambahkannya secara eksplisit ke blok teks:

public String getTextWithCarriageReturns() { return """ separated with\r carriage returns"""; } @Test void givenATextWithCarriageReturns_thenItContainsBoth() { assertThat(subject.getTextWithCarriageReturns()) .isEqualTo("separated with\r\ncarriage returns"); }

5. Pemformatan

Untuk membantu substitusi variabel, metode baru ditambahkan yang memungkinkan pemanggilan metode String.format secara langsung pada literal String:

public String getFormattedText(String parameter) { return """ Some parameter: %s """.formatted(parameter); }

Semua fitur tersebut sudah memberikan fitur yang sangat powerful. Namun, Java 14 telah menyertakan beberapa fitur tambahan. Kita akan melihat lebih banyak tentang itu selanjutnya.

6. Urutan Escape Baru di Jawa 14

Pratinjau kedua dari fitur Blok Teks menambahkan dua urutan pelolosan tambahan.

6.1. Terminator Jalur Keluar

Terkadang, kami mungkin memiliki baris teks yang panjang dalam kode sumber kami yang ingin kami format dengan cara yang dapat dibaca. Pratinjau kedua menambahkan fitur yang memungkinkan kita melakukan ini. Kita bisa keluar dari baris baru sehingga diabaikan :

public String getIgnoredNewLines() { return """ This is a long test which looks to \ have a newline but actually does not"""; }

Sebenarnya literal String ini hanya akan sama dengan String normal yang tidak terputus :

@Test void givenAStringWithEscapedNewLines_thenTheResultHasNoNewLines() { String expected = "This is a long test which looks to have a newline but actually does not"; assertThat(subject.getIgnoredNewLines()) .isEqualTo(expected); }

6.2. Melarikan Diri dari Spaces

Kompilator mengabaikan semua spasi tambahan dalam blok teks . Namun, karena preview kedua, kita bisa melarikan diri ruang menggunakan urutan escape baru \ s . Kompilator juga akan menyimpan spasi apa pun di depan ruang yang lolos ini.

Mari kita lihat lebih dekat dampak dari ruang yang lolos:

public String getEscapedSpaces() { return """ line 1······· line 2·······\s """; } @Test void givenAStringWithEscapesSpaces_thenTheResultHasLinesEndingWithSpaces() { String expected = "line 1\nline 2 \n"; assertThat(subject.getEscapedSpaces()) .isEqualTo(expected); } 

Catatan : spasi pada contoh di atas diganti dengan simbol '·' agar terlihat.

Kompilator akan menghapus spasi dari baris pertama. Namun, baris kedua diakhiri dengan ruang yang keluar dan semua ruang dipertahankan.

7. Kesimpulan

Dalam tutorial singkat ini, kami melihat fitur Java Text Blocks. Ini mungkin bukan pengubah permainan, tetapi ini membantu kita untuk menulis kode yang lebih baik dan lebih mudah dibaca, yang umumnya merupakan hal yang baik.

Seperti biasa, kode sumber lengkap artikel tersedia di GitHub.