Javaのコードを書くうえで、文字列リテラルは避けて通れない要素です。
従来は長い文字列を書く際に\n
で改行を入れたり、+
演算子で連結したりと、煩雑な記述が課題でした。Java 15から正式導入された「テキストブロック」は、複数行の文字列をより直感的・可読性高く記述できる新しい仕組みです。本記事では、テキストブロックの基礎から動作原理まで、初心者の方にもわかりやすく解説していきます。
String textBlock = """ ここはテキストブロックの例です。 複数行を そのまま記述できます。 """;
テキストブロックの基本的な書き方
テキストブロックは、次のように """
(ダブルクォート3つ)で囲んで複数行の文字列を記述します。
String textBlock = """ ここはテキストブロックの例です。 複数行を そのまま記述できます。 """;
テキストブロックの動作原理を理解する
テキストブロックはコンパイラが解釈するときに、次のようなルールで文字列を構築します。
自動的な改行の扱い
テキストブロック内の改行は、そのままJavaの文字列に反映されます。従来であれば \n
を入れる必要があった部分も、テキストブロックなら自然に反映されるというわけです。
String multiline = """ 一行目 二行目 三行目 """;
このコードは実行時に改行を含む文字列として扱われます。文字列リテラルの中身を「見たまま」の形で得られるのが特徴です。
インデントの除去
テキストブロックは先頭のインデントを除去する工夫がなされています。最も左側の部分を基準として、全ての行から均等にインデントを取り除くようになっています。これにより、以下のような書き方をしても、見た目はインデントされているのに文字列としては余計なスペースが含まれません。
String indented = """ { "name": "Java", "version": 15 } """;

↑の例では、各行に4スペースのインデントが入っていますが、コンパイラは最小インデントの量だけを自動的に削除してくれます。結果として、文字列リテラルには余計なスペースが含まれない形となります。
エスケープの必要性
テキストブロックの中では、基本的に "
(ダブルクォート)をエスケープする必要はありません。ただし、\
(バックスラッシュ)などは必要に応じてエスケープしないと意味が変わる場合があります。例えば、改行コードを直接指定したいときに \n
は従来通り解釈される場合があるなど、必要に応じて使い分けましょう。
テキストブロックの使い方を1から
ステップ1:Javaバージョンを確認する
テキストブロックを使うには、Java 15以降(Java 13や14でもプレビュー機能として使用可能でしたが、正式版は15)を利用する必要があります。ご自身のJavaバージョンを確認してから始めましょう。
ステップ2:テキストブロックを宣言してみる
まずは最もシンプルな例を試してみます。
public class TextBlockExample { public static void main(String[] args) { String message = """ これはテキストブロックのサンプルです。 文字列の中に改行をそのまま表現できます。 """; System.out.println(message); } } /* 出力 これはテキストブロックのサンプルです。 文字列の中に改行をそのまま表現できます。 */
このコードを実行すると、改行を含む文字列が出力されます。従来なら複数の System.out.println()
や "\n"
で対応していた部分が、非常にシンプルに書けるようになります。
ステップ3:インデントとトリムの確認
次は、インデントを活かしながらも、コンパイラがどのように文字列を構築しているかを見てみましょう。
public class TextBlockIndent { public static void main(String[] args) { String jsonData = """ { "language": "Java", "feature": "Text Blocks" } """; System.out.println(jsonData); } } /* 出力 { "language": "Java", "feature": "Text Blocks" } */
ソースコード上はインデントされていますが、実際に出力される文字列には余計なインデントが付きません。もしインデントをつけたい場合は、最初の行だけインデントを減らす、あるいは文字列中にスペースを入れたい位置だけ意図的に入れるなどの工夫が必要です。
ステップ4:複雑な文字列を扱う
HTMLやSQLのように複雑な文字列も、テキストブロックであればそのまま貼り付ける感覚で書けます。
public class TextBlockHTML { public static void main(String[] args) { String html = """ <html> <head> <title>サンプル</title> </head> <body> <h1>テキストブロックの例</h1> <p>複数行にわたるHTMLをシンプルに記述できます。</p> </body> </html> """; System.out.println(html); } }

エスケープシーケンスの必要が最低限ですむため、HTMLをそのままコピーペーストしたような形で記述できるのが大きなメリットです。
項目 | 従来の文字列リテラル | テキストブロック |
---|---|---|
改行の扱い | "\n" の明示または連結で対応 | 文字列中にそのまま改行を書ける |
インデントの扱い | スペースやタブを文字列に含めると可読性低下 | 自動的に最小インデントが除去され可読性向上 |
エスケープの必要性 | " や \ を頻繁にエスケープする必要がある | ダブルクォートはそのまま使用可能 |
メンテナンス性 | 長くなるほど修正しづらい | 見たままの形で表現されるので修正しやすい |
登場時期 | Java 1.0から存在 | Java 13でプレビュー、15で正式導入 |