PR

Javaのテキストブロックを1分で徹底解説!

Java

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で正式導入

テキストブロックが生まれた背景

従来の文字列リテラルの課題

  • 改行やインデントが面倒
    長いテキストを表現する場合、\nを使ったり文字列を連結したりする必要があり、可読性が低下していました。
  • HTMLやJSONなどを書くのが大変
    HTMLやJSONのように構造があるテキストを文字列として埋め込むとき、改行やインデントが複雑でエスケープも必要になるため、コードが煩雑になりやすいという問題がありました。

テキストブロックのメリット

  • コードが読みやすくなる
    文字列中の改行やスペースをそのまま書けるため、HTMLやSQL、JSONといった外部フォーマットの文字列を自然に埋め込めます。
  • エスケープを大幅に削減
    ダブルクォート(")などの記号をそのまま文字列として使えるため、従来のような過剰なエスケープが不要です。
  • メンテナンス性の向上
    文字列の内容自体が「見たまま」に近い形で表現できるので、コードの修正やレビューが容易です。

まとめ Javaのテキストブロック

テキストブロックは、Javaプログラミングの可読性と保守性を大幅に向上させる魅力的な機能です。改行やインデント、エスケープの煩わしさから解放され、複数行にわたる文字列が「見たまま」の形でコードに落とし込めます。特にHTMLやSQL、JSONのような外部フォーマットを多用する場合、その恩恵は非常に大きいでしょう。

  • ポイントのおさらい
    1. Java 15以降で正式機能として利用可能
    2. """ で囲むだけで複数行の文字列を自然に記述
    3. インデントの削除や改行の扱いが自動的
    4. ダブルクォートのエスケープ不要で記述がシンプルに

従来の文字列リテラルで煩雑だった部分が非常に簡潔になり、可読性やメンテナンス性が格段に向上します。Javaのコードをより洗練させたい方は、ぜひテキストブロックを活用してみてください。

タイトルとURLをコピーしました