テキストブロックを一言でいうと
テキストブロックは、"""(ダブルクォート3つ)で囲んで
「複数行の文字列を、そのままの見た目で書ける」
新しい文字列リテラルです(Java 15 以降で正式導入)。
今までのように \n を並べたり、" をエスケープしまくったりしなくてよくなります。
SQL、JSON、HTML、テンプレート文字列など、「長くて複数行になる文字列」を書くときに威力を発揮します。
まずは普通の文字列との違いを体感する
従来の書き方がどれだけつらかったか
例えば、SQL を文字列で書こうとすると、従来はこうなります。
String sql =
"SELECT id, name " +
"FROM users " +
"WHERE active = 1 " +
"ORDER BY created_at DESC";
Java改行を入れたければ \n を書き、" が出てくれば \" とエスケープし、
行をつなぐために + を並べる。
「コンパイラのための記号」がたくさん混ざって、
本来読みたい「SQLそのもの」が見えにくくなっていました。
テキストブロックで書くとどうなるか
同じ SQL をテキストブロックで書くと、こうなります。
String sql = """
SELECT id, name
FROM users
WHERE active = 1
ORDER BY created_at DESC
""";
Javaほぼ「コピペしただけ」です。
改行もインデントも、そのままの形で書けます。
ここで感じてほしいのは、
「文字列リテラルを“コード”としてではなく、“テキスト”として読めるようになる」
という感覚です。
基本構文とルールをしっかり押さえる
開始と終了は “””(ダブルクォート3つ)
テキストブロックは、必ず
"""
(ここに複数行の文字列)
"""
Javaという形で書きます。
開始の """ の直後には、原則として文字を書きません。
すぐに改行して、その次の行から内容を書き始めます。
String text = """
これはテキストブロックです。
複数行を書けます。
""";
Java終了の """ は、内容の最後の行の「次の行」に書きます。
中身は普通の String(特別な型ではない)
テキストブロックは、あくまで String リテラルの新しい書き方です。
String a = "hello";
String b = """
hello
""";
System.out.println(a.getClass() == b.getClass()); // true
JavaString であることに変わりはなく、
メソッド呼び出しや連結、フォーマットなど、今まで通りに扱えます。
インデント(空白)の扱いをちゃんと理解する
ここが一番つまずきやすいところなので、少し丁寧にいきます。
「共通の左側の空白」は自動で削られる
次のコードを見てください。
String text = """
line1
line2
line3
""";
System.out.println(text);
Java出力はこうなります。
line1
line2
line3
コード上では各行の先頭に 4 つのスペースがありますが、
実際の文字列には含まれていません。
テキストブロックは、
「すべての行に共通している左側の空白」を自動的に取り除きます。
これのおかげで、コードのインデントに合わせてテキストブロックを字下げしても、
文字列の中身が変にずれません。
わざとインデントを残したいとき
もし、文字列の中にインデントを残したい場合は、
その行だけ空白を増やします。
String text = """
line1
line2
line3
""";
Javaこの場合、共通の左側の空白は 4 つなので、line2 の行には「追加の 4 つの空白」が残ります。
出力はこうなります。
line1
line2
line3
「共通部分だけ削る」というルールを意識すると、
インデントをコントロールしやすくなります。
エスケープと改行の扱い
改行はそのまま入る(\n を書かなくていい)
テキストブロックでは、行を変えればそのまま改行文字が入ります。
String text = """
A
B
C
""";
Javaこれは "A\nB\nC\n" に相当します(最後に 1 つ改行が入る点もポイント)。
最後の改行を入れたくない場合は、
終了の """ を同じ行に書くのではなく、
行末に \ を使って「改行を無視する」テクニックもあります。
String text = """
A
B
C""";
Javaこの場合は "A\nB\nC" になります。
“(ダブルクォート)はエスケープ不要
普通の文字列では、" を書くときに \" とエスケープが必要でした。
テキストブロックでは、""" そのものを使わない限り、" をそのまま書けます。
String html = """
<input type="text" value="hello">
""";
JavaHTML や JSON で " が頻出する場合、
エスケープ地獄から解放されるのはかなり大きなメリットです。
実用的な例でイメージを固める
SQL
String sql = """
SELECT id, name, email
FROM users
WHERE active = 1
ORDER BY created_at DESC
""";
JavaSQL のフォーマットをそのまま保てるので、
DB クライアントにコピペしても読みやすいです。
JSON
String json = """
{
"id": 1,
"name": "Alice",
"active": true
}
""";
JavaJSON の構造がそのまま見えるので、
「どんなデータを送っているか/受け取っているか」が一目で分かります。
HTML / テンプレート
String html = """
<html>
<body>
<h1>Hello</h1>
<p>Welcome!</p>
</body>
</html>
""";
Javaテンプレートエンジンを使わない簡単な画面生成などでは、
テキストブロックだけで十分なことも多いです。
テキストブロックを使うときの設計的なポイント
「コード」と「テキスト」を頭の中で分ける
テキストブロックの良さは、
「これは“コード”ではなく“テキスト”なんだ」と
視覚的に切り替えられることです。
SQL や JSON をテキストブロックに閉じ込めることで、
ビジネスロジックのコードと、
外部システムとやり取りするテキストを、
頭の中でスッと分離しやすくなります。
長くなりすぎるなら、専用ファイルに逃がす判断も大事
テキストブロックは便利ですが、
あまりに長い SQL や HTML を 1 ファイルに詰め込みすぎると、
今度は「Java ファイルがテキストだらけで読みにくい」という別の問題が出てきます。
「これはもうテンプレートファイルにした方がいいな」
「SQL ファイルとして外出しした方がいいな」
と感じたら、テキストブロックにこだわらず、
外部ファイル+読み込みという設計に切り替えるのも大事な判断です。
まとめ:テキストブロックを自分の言葉で説明するなら
あなたの言葉でテキストブロックを説明すると、こうなります。
「テキストブロックは、""" で囲んで複数行の文字列をそのまま書ける新しい String リテラル。
SQL や JSON、HTML などを、\n や \" に悩まされず、“見たままの形”でコードに埋め込める。
共通の左インデントは自動で削られるので、コードのインデントを崩さずに書ける。
あくまで普通の String なので、今まで通りメソッドや連結に使えるが、
長くなりすぎる場合は外部ファイルに逃がす判断もセットで考えると、設計としてバランスが良い。」
