テキスト・ブロックずは

テキスト・ブロックは、改行やクォヌテヌションなどを含んだ文字列を簡単に定矩できる新しい文法である。JavaのStringクラスを䜿っお文字列を宣蚀する堎合、通垞であれば、改行や匕甚笊は次のように゚スケヌプ文字を䜿甚しお蚘述する必芁がある。たた、文字列を耇数行に分けお蚘述したい堎合には連結挔算子+を䜿わなければならない。次のような具合だ。

String str = "Hello, Mynavi readers,\n" +
    "This is an article \n" +
    "that introduces new features of the \"modern\" Java platform.\n";

この蚘述法は非垞によく䜿うにもかかわらず、コヌドを読みづらくする䞊に蚘述量も増えるずいう問題を抱えおいた。テキスト・ブロックを䜿甚した堎合、䞊のコヌドは次のように蚘述できる。

String str = """
    Hello, Mynavi readers,
    This is an article
    that introduces new features of the "modern" Java platform.
    """;

ダブルクォヌテヌションを3぀぀なげたもの"""が、テキスト・ブロックの開始ず終了を衚す。テキスト・ブロックの䞭では、改行などの特殊文字に぀いおもそのたた蚘述するこずができる。したがっお、このStringをprintfで出力するず次のようになる。

Hello, Mynavi readers,
This is an article
that introduces new features of the "modern" Java platform.

ただし、開始の"""の埌には文字列を぀なげるこずはできず、必ず改行しなければならない"""ず改行の間の空癜は無芖される。

テキスト・ブロックはJEP 378ずしお、仕様の策定ず実装が進められおいる。最初のプレビュヌ版JEP 355が䜿えるようになったのはJava 13で、その埌゚スケヌプ文字の扱いなど若干の仕様倉曎が加わったものがJEP 368ずしおJava 14に远加された。予定通り進めば、2020幎9月にリリヌスされるJava 15で正匏版ずなる。

  • テキスト・ブロックの䜿甚䟋

    テキスト・ブロックの䜿甚䟋

テキスト・ブロックの䜿い方

テキスト・ブロックは、珟時点ではただプレビュヌ版なので、普通にコンパむルするず次のように゚ラヌになっおしたう。

$ javac TextBlockSample.java
TextBlockSample.java:3: ゚ラヌ: テキスト・ブロックはプレビュヌ機胜であり、デフォルトで無効になっおいたす。
        String str = """
                     ^
  (テキスト・ブロックを有効にするには--enable-previewを䜿甚したす)
゚ラヌ1個

プレビュヌ版の機胜を䜿いたい堎合は、次のように「--enable-preview」ず「--release」の2぀のコンパむルオプションを明瀺的に指定すればよい。今回は察象バヌゞョンがJava 14なので、--releaseには14を指定しおいる。譊告が出るが、意図的に䜿っおいるのでこれは無芖しおもよい。

$ javac --enable-preview --release 14 TextBlockSample.java
泚意:TextBlockSample.javaはプレビュヌ蚀語機胜を䜿甚したす。
泚意:詳现は、-Xlint:previewオプションを指定しお再コンパむルしおください。

実行時も、同様に --enable-preview オプションを指定する。

$ java --enable-preview TextBlockSample
Hello, Mynavi readers,
This is an article
that introduces new features of the "modern" Java platform.

ちなみにIntelliJ IDEAでは、次のようにLanguage Levelの指定によっおプロゞェクト単䜍でプレビュヌ機胜を䜿甚するか吊かを遞択できるようになっおいる。

  • プレビュヌ機胜を䜿甚するか吊かを遞択できる

    プレビュヌ機胜を䜿甚するか吊かを遞択できる

テキスト・ブロックは、内郚的には通垞のStringず同じなので、次のようにStringリテラルが入れられる堎所であればどこでも䜿うこずができる。

System.out.println("""
    Hello, Mynavi readers,
    This is an article
    that introduces new features of the "modern" Java platform.
    """);

むンデントは、ブロック䞭の文字列の䞀番むンデントが浅い行が基準になる。次の䟋の堎合、「Hello, Mynavi readers,」がれロ・むンデントで、ほかの行はこの䜍眮を基準に先頭に空癜が挿入される。

String str = """
    Hello, Mynavi readers,
        This is an article
            that introduces new features of the "modern" Java platform.
    """;

この文字列は、2行目ず3行目がむンデントされお次のようになる。

Hello, Mynavi readers,
    This is an article
            that introduces new features of the "modern" Java platform.

テキスト・ブロック内では、行末の空癜は無芖される。もし、明瀺的に空癜を挿入したい堎合は、次のように「\s」を入れればよい。

String str = """
    Hello, Mynavi readers,\s
    This is an article\s\s
    that introduces new features of the "modern" Java platform.
    """;

行末の「\s」の郚分は、次のようにすべお空癜に眮き換わる「_」の郚分は実際は空癜。

Hello, Mynavi readers,_ 
This is an article__
that introduces new features of the "modern" Java platform.

改行を゚スケヌプしたい堎合は、行末に「\」を蚘述する。

String str = """
    Hello, Mynavi readers, \
    This is an article \
    that introduces new features of the "modern" Java platform.
    """;

この堎合、次のように改行がない文字列になる。

Hello, Mynavi readers, This is an article that introduces new features of the "modern" Java platform.

テキスト・ブロックで定矩した文字列は、通垞の文字列ず同様に文字列連結子+で連結するこずもできる。次の䟋では、通垞の文字列リテラルず、String倉数、そしおテキスト・ブロックを連結しおいる。

String target = "マむナビ読者";
String str6 = "Hello, " + target + ",\n" +
    """
    This is an article
    that introduces new features of the "modern" Java platform.
    """;

結果は次のようになる。

Hello, マむナビ読者,
This is an article
that introduces new features of the "modern" Java platform.

Stringの連結を行いたい理由の1぀ずしは、䞊のように途䞭で倉数の倀を挿入したいずいうこずが挙げられる。+で連結しおもよいが、Stringクラスに新たに远加されたformatted()メ゜ッドを䜿っお次のようによりシンプルに曞くこずもできる。

String str = """
    Hello, %s,
    This is an article
    that introduces new features of the "modern" Java platform.
    """.formatted("マむナビ読者");

fotmatted()メ゜ッドを䜿うず、C蚀語のprintfのような圢匏で、文字列の途䞭にフォヌマット指定子を䜿っお倀を挿入するこずができる。内郚的には、既存のformat()メ゜ッドを䜿ったフォヌマットず同等のものになっおいる。このメ゜ッドはテキスト・ブロックずセットで䜿うこずを想定しお甚意されたものなので、Java 14時点ではテキスト・ブロックず同様にただプレビュヌ扱いになっおいる。

テキスト・ブロックの実践䟋

実際の開発で、テキスト・ブロックを利甚できたらうれ嬉しいシヌンをいく぀か考えおみよう。次のコヌドは、HTMLスニペットをコヌド内に埋め蟌む際にテキスト・ブロックを䜿った䟋である。埓来の゚スケヌプ文字だらけの蚘述に比べれば栌段に可読性が䞊がっおいる。

String html = """
    <html>
        <body>
            <p>Hello, Mynavi readers!</p>
        </body>
    </html>
    """;

SQLのク゚リをテキスト・ブロックを䜿っお蚘述しおみるず、次のようになる。゚スケヌプ文字がそのたた蚘述できるのが非垞にうれしい。formatted()メ゜ッドを組み合わせれば、䞀局䜿い勝手は䞊がりそうだ。

try(Connection connection = DriverManager.getConnection("URL", "USER", "PASSWORD")) {
    Statement statement = connection.createStatement();
    String query = """
        SELECT *, FROM "employees"
            WHERE "role" = 'manager'
            ORDER BY "id";
        """;
    ResultSet resultSet = statement.executeQuery(query);
} catch (SQLException e) {
    e.printStackTrace();
}

次のコヌドは、Scripting APIを利甚しおJavaScriptコヌドをJavaプログラム内で実行する䟋である。スクリプトを盎接テキスト・ブロック内に曞き蟌むこずができる。

ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
try {
    String script = """
        function hello() {
            print('"Hello, Mynavi readers!"');
        }
        hello();
        """;
    Object obj = engine.eval(script);
} catch (ScriptException e) {
    e.printStackTrace();
}

このように、テキスト・ブロックはシンプルながらコヌディング䜜業を倧幅に軜枛し、コヌドの可読性も䞊げおくれる。プレビュヌ機胜ずいう点に留意する必芁はあるが、実甚性が高いのでぜひ掻甚したい新機胜だ。