テキスト・ブロックは複数行にまたがる文字列を簡単に宣言するための Java の新しい機能です。この記事では、Java 15で新たに追加されたテキスト・ブロックの使用方法について解説していきます。
テキスト・ブロックとは
冒頭で述べたとおり、テキスト・ブロックは Java 15で追加された、改行を含む文字列を簡単に宣言するための新しい文法です。Java 13でプレビュー機能として追加され、いくつかの仕様変更が行れたのち、Java 15で正式な機能となりました。
テキスト・ブロックが登場する以前までは、改行を含む複数行の文字列を宣言する場合は、次のように、改行コードと +で文字列を連携させる煩雑なコードを記述する必要がありました。
String message = "Welcam Potepan\n" +
"Unlock\n" +
"Your Potential\n";
テキスト・ブロックを使用することで、上のコードは、次のような洗練されたコードに書き換えることが可能になりました。
String message = """
Welcam Potepan
Unlock
Your Potential
""";
テキスト・ブロックの使用方法
上で紹介したように、テキスト・ブロックは、 3つのダブルクォーテーションで文字列の開始と終了を宣言します。
"""
文字列
"""
また、開始の “”” の後は必ず改行しなければならず、“”” の後ろに文字列を付けることはできません。(以下のコードはコンパイルエラーとなる)
String message = """文字列
文字列
""";
//Error:String literal is not properly closed by a double-quote
テキスト・ブロックは、普通の String 型の文字列と同じであるため、メソッドの引数に直接指定することもできます。
public static void main(String[] args) {
System.out.println("""
<person>
<firstName>Bob</firstName>
<lastName>Jones</lastName>
</person>
""");
}
改行コードはLF(\u000A)に置き換えられる
ソースコードの改行コード(ラインターミネータ)は、OS や開発ツールに依存し、Windows であれば CR + LFとなり、UNIX 系の OS であれば LF で保存されるのが一般的です。
テキスト・ブロックでは、このような環境依存をなくすため、コンパイル時に「LF(\u000A)」に正規化されます。
余分な空白は除去され、必要なインデントは残る
テキスト・ブロックでは、各行に設定された付随的なインデントは除去され、開発者が明示的に付けたインデントは残るように設計されています。
次のような JSON 形式の文字列を、テキスト・ブロックで書く場合の例で見てみましょう。
下記イメージの青枠で囲った部分のインデントは、コードの可読性などのために付けられた付随的なインデントで、実行時には不要な空白であると考えられます。
一方で、赤枠で囲った部分は、ユーザーが明示的に付けたインデントであり、実行時にも必要な空白です。
実際に上のコードを実行して、結果を確認してみましょう。付随的なインデントが削除され、必要なインデントだけが残っているのが分かるでしょう。
実行結果
{
"firstName": "Bob",
"lastName": "Jones"
}
テキスト・ブロックは、各行のインデントが最も浅いところ(空白以外の文字が最も早く出現する位置)を行の先頭して見なしており、行の先頭以前にある付随的なインデントは、コンパイル時に除去されるようになっています。
各行の末尾の空白は除去される
テキスト・ブロックでは、各行の末尾の空白は無視されます。(コンパイル時に除去される)
//以下のコードでは、各行の末尾に空白を5つ設定しています。
System.out.println("""
Welcam Potepan
Unlock
Your Potential
""".replaceAll(" ", "△"));
実行結果
Welcam△Potepan
Unlock
Your△Potential
replaceAll で空白を △ に変換して表示していますが、末尾の空白はコンパイル時に除去されているため、 各行の末尾に△ が表示されていなことが分かります。
もし、末尾に空白を挿入したい場合は、\s で明示的に空白を指定できます。
//2行目に「\s」で空白を2文字設定
System.out.println("""
Welcam Potepan
Unlock\s\s
Your Potential
""".replaceAll(" ", "△"));
実行結果
Welcam△Potepan
Unlock△△
Your△Potential
改行をエスケープする時は「\」を使用
テキスト・ブロック内の改行は、そのまま実行時にも改行コードが挿入されるが、行末に \ を設定すると、改行をエスケープ できます。
System.out.println("""
Welcam Potepan, \
Unlock, \
Your Potential
""");
実行結果
Welcam Potepan, Unlock, Your Potential
テキスト・ブロックの活用
テキスト・ブロックの実践的な活用例を見ていきましょう。
XML・JSONの作成
テキスト・ブロックと formatted メソッドを組み合わせて使用することで、これまで文字列連携などで複雑なコードになりがちだった XML や、JSON 形式のテキストが、格段に見やすく書くことができます。
String json = """
{
"firstName": "%s",
"lastName": "%s"
}
""".formatted(first, last);
最終行の改行を除く
テキスト・ブロックでは、終端記号の “”” を改行して書くと、を最終行に改行コードが挿入されます。この改行コードが不要な場合は、“”” を最終行に続けて書くか、\ で改行をエスケープ することで、最終行に改行コードが挿入されるのを防ぐことができます。
System.out.println("""
Welcam Potepan
Unlock
Your Potential""");
//もしくは
System.out.println("""
Welcam Potepan
Unlock
Your Potential\
""");
まとめ
Java 15で正式に追加されたテキスト・ブロックの使用方法を解説してきました。
テキスト・ブロックは、複雑になりがちな複数行文字列の処理をシンプルに記述できる構文であるため、是非活用していってください。
文字列を扱う Java 開発者なら、誰しも経験した改行コードと +で文字列連結するコードは、多くの開発者にとって苦痛な作業でした。テキスト・ブロックの登場によって、このような作業から解放され、より直感的で見やすい宣言ができるようになりました。