テキストブロックって何?

docs

今回はJava 15から導入されたテキストブロックについて解説するよ!

これはJavaでの文字列の扱いを劇的に楽にしてくれる新機能なんだ。Javaプログラマーなら絶対知っておきたい便利な機能だから、一緒に見ていこうね。

今までのJavaで複数行にわたる文字列を扱おうとすると、ちょっと面倒だったんだ。改行ごとに\nを入れたり、+で連結したりする必要があったからね。

例えば、こんなHTMLのコードをJavaの文字列として表現したいとするよ。

HTML

<!DOCTYPE html>
<html>
    <head>
        <title>サンプルページ</title>
    </head>
    <body>
        <h1>こんにちは!</h1>
        <p>これはテキストブロックのサンプルです。</p>
    </body>
</html>

これをテキストブロックなしで書くとこうなるよね。

Java

String html = "<!DOCTYPE html>\n" +
              "<html>\n" +
              "    <head>\n" +
              "        <title>サンプルページ</title>\n" +
              "    </head>\n" +
              "    <body>\n" +
              "        <h1>こんにちは!</h1>\n" +
              "        <p>これはテキストブロックのサンプルです。</p>\n" +
              "    </body>\n" +
              "</html>";
System.out.println(html);

どう? ちょっとごちゃごちゃして読みにくくない?

そこで登場するのがテキストブロックなんだ! テキストブロックを使うと、こんな風に書けるようになるよ。

Java

String html = """
            <!DOCTYPE html>
            <html>
                <head>
                    <title>サンプルページ</title>
                </head>
                <body>
                    <h1>こんにちは!</h1>
                    <p>これはテキストブロックのサンプルです。</p>
                </body>
            </html>
            """;
System.out.println(html);

見てわかる通り、コードがすごくスッキリしたよね! 改行コードや連結の+が一切ないから、HTMLの構造がそのままJavaコードに反映されてるみたいに見える。これがテキストブロックの最大のメリットなんだ。


テキストブロックの書き方

テキストブロックは、トリプルダブルクォート (""") で囲むのがルールだよ。

  • 開始: """ の後に改行。この開始の"""の後の改行は文字列には含まれないからね。
  • 内容: 複数行にわたる文字列を自由に記述。
  • 終了: """ で閉じる。

例えば、

Java

String myText = """
    これは
    テキストブロックの
    サンプルです。
    """;
System.out.println(myText);

このコードを実行すると、

これは
テキストブロックの
サンプルです。

と表示されるよ。

インデントの扱いはどうなるの?

テキストブロックは、インデントの扱いにちょっとしたルールがあるんだ。テキストブロック内の文字列の左端は、終了の"""と同じインデントレベルに合わせると、それより右側のインデントはそのまま反映されるよ。

例えば、

Java

public class TextBlockSample {
    public static void main(String[] args) {
        String code = """
                public static void main(String[] args) {
                    System.out.println("Hello, Text Block!");
                }
                """;
        System.out.println(code);
    }
}

この場合、public static void main(String[] args) { の行は、終了の"""よりインデントが深いよね。なので、出力される文字列もそのインデントが維持されるんだ。

もし、すべての行の左側の余白を取り除きたい場合は、終了の"""を文字列の最も左の文字と同じインデントレベルに持っていくか、String.stripIndent()などのメソッドを使う方法もあるよ。でも、基本的には終了の"""の位置でインデントの基準が決まると覚えておくといいよ。


テキストブロックで変数を使う方法

テキストブロックのすごいところは、ただ複数行の文字列を書きやすくするだけじゃないんだ。変数や式を文字列の中に埋め込むこともできるんだよ! これは文字列補間 (String Interpolation) と呼ばれる機能で、Java 15以降ではテキストブロックと組み合わせて使うことができるんだ。

具体的には、String.formatted()メソッドを使うか、StringTemplateという機能(Java 21からプレビュー)を使うことができるよ。今回はシンプルにString.formatted()メソッドを使った例を紹介するね。

String.formatted()メソッドを使う

これは、C言語のprintf関数やPythonのf-stringに近い感覚で使えるんだ。プレースホルダー(%s%dなど)を使って、そこに後から変数の値を埋め込むことができるよ。

Java

String name = "田中";
int age = 30;

String message = """
    こんにちは、%sさん!
    あなたは現在%d歳ですね。
    """.formatted(name, age);

System.out.println(message);

このコードを実行すると、

こんにちは、田中さん!
あなたは現在30歳ですね。

と表示されるんだ。%sのところにnameの値が、%dのところにageの値がきちんと入っているのがわかるよね。

複数の変数を埋め込む場合は、formatted()メソッドの引数に順番に渡していけばOKだよ。

もう少し実用的な例として、ユーザーからの入力メッセージを生成するケースを考えてみよう。

Java

String userName = "Alice";
String itemName = "コーヒーメーカー";
double price = 9800.50;

String orderConfirmation = """
    %s様、ご注文ありがとうございます!
    以下の商品が注文されました:
    商品名: %s
    価格: %.2f円
    ご注文内容にお間違いがないかご確認ください。
    """.formatted(userName, itemName, price);

System.out.println(orderConfirmation);

出力結果はこうなるよ。

Alice様、ご注文ありがとうございます!
以下の商品が注文されました:
商品名: コーヒーメーカー
価格: 9800.50円
ご注文内容にお間違いがないかご確認ください。

%.2fのように書くと、浮動小数点数を小数点以下2桁まで表示するといったフォーマットも指定できるから、いろんな場面で役立つよ!


導入前との比較

テキストブロックが導入される前は、複数行の文字列を扱うのが本当に大変だったんだ。特に、HTMLやSQL、JSONなど、構造を持った文字列をJavaコードの中で書こうとすると、エスケープシーケンス(\", \nなど)の嵐で、可読性が著しく低下していたんだよね。

HTMLの例(再掲)

導入前:

Java

String htmlBefore = "<!DOCTYPE html>\n" +
                    "<html>\n" +
                    "    <head>\n" +
                    "        <title>サンプルページ</title>\n" +
                    "    </head>\n" +
                    "    <body>\n" +
                    "        <h1>こんにちは!</h1>\n" +
                    "        <p>これはテキストブロック導入前のサンプルです。</p>\n" +
                    "    </body>\n" +
                    "</html>";
System.out.println(htmlBefore);

導入後 (テキストブロック):

Java

String htmlAfter = """
            <!DOCTYPE html>
            <html>
                <head>
                    <title>サンプルページ</title>
                </head>
                <body>
                    <h1>こんにちは!</h1>
                    <p>これはテキストブロック導入後のサンプルです。</p>
                </body>
            </html>
            """;
System.out.println(htmlAfter);

一目瞭然だよね。テキストブロックを使えば、外部ファイルからコピペしてきたような感覚で、そのままJavaコードに貼り付けることができるんだ。これによって、コードの可読性が向上し、文字列の内容を視覚的に把握しやすくなるという大きなメリットがあるよ。

SQLの例

データベースを操作するSQL文も、複数行になることが多いよね。

導入前:

Java

String sqlBefore = "SELECT id, name, email\n" +
                   "FROM users\n" +
                   "WHERE age > 20\n" +
                   "ORDER BY name ASC;";
System.out.println(sqlBefore);

導入後 (テキストブロック):

Java

String sqlAfter = """
            SELECT id, name, email
            FROM users
            WHERE age > 20
            ORDER BY name ASC;
            """;
System.out.println(sqlAfter);

SQL文もテキストブロックを使えば、IDEのSQLシンタックスハイライトが効いているかのように、より自然に記述できるんだ。これにより、SQL文の修正やデバッグも格段に楽になるよ。

JSONの例

APIとの連携などでJSON文字列を扱うことも多いよね。

導入前:

Java

String jsonBefore = "{\n" +
                    "  \"name\": \"Alice\",\n" +
                    "  \"age\": 25,\n" +
                    "  \"city\": \"Tokyo\"\n" +
                    "}";
System.out.println(jsonBefore);

導入後 (テキストブロック):

Java

String jsonAfter = """
            {
              "name": "Alice",
              "age": 25,
              "city": "Tokyo"
            }
            """;
System.out.println(jsonAfter);

JSONも同様に、導入後は非常にすっきりするよね。余計なエスケープシーケンスがないため、JSON構造をそのままコードに表現できるんだ。


まとめ

今回はJava 15で導入されたテキストブロックについて解説したよ。

  • テキストブロックは、トリプルダブルクォート (""") で囲まれた複数行文字列のこと。
  • 改行コード (\n) や連結 (+) が不要になり、コードの可読性が大幅に向上する。
  • String.formatted()メソッドと組み合わせることで、変数や式を文字列に埋め込むことができる。
  • HTML、SQL、JSONなど、構造を持った文字列を扱う際に特にその威力を発揮する。

Javaで文字列を扱うことがあれば、ぜひテキストブロックを使ってみてね。きっと開発がもっと快適になるはずだよ!


その他の参考記事

Javaの学習をさらに深めたい場合は、以下の記事も参考にしてみてね!

コメント

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