S-JIS[2020-09-16] 変更履歴
Javaのテキストブロックについて。
テキストブロックとは、複数行にまたがる文字列のこと。
Java15以降(プレビュー版はJava13〜14)で使用可能。
テキストブロック | 従来の文字列 |
---|---|
""" |
"aaa\nbbb\n" |
つまり、改行を含む文字列リテラルが書きやすくなる。
あくまで複数行文字列を書きやすくする為のものであり、\のエスケープを無くすものではない。
(テキストブロック専用のエスケープ文字もある)
また、これに伴ってStringクラスにテキストブロック関連のメソッドが追加されている。
テキストブロックは、ダブルクォーテーション3つ「"""
」で文字をくくる。
テキストブロックの例 | 従来の文字列 | 備考 |
---|---|---|
""" |
"aaa\nbbb\n" |
テキストブロックは「""" 改行」で始める。テキストブロック内の改行は、実際の文字列としては文字コード0a(\n)になる。 (Windowsだとテキストブロック内の改行コードが0d0a(\r\n)になる事もあるが、その場合でも0aに変換される) |
"""aaa |
テキストブロックを「""" 改行」で始めないと(「""" 」の直後に文字を続けると)エラーになる。Example.java:6: エラー: テキスト・ブロックの開始区切り文字のシーケンスが無効です。行の終了文字がありません """aaa ^ |
|
""" |
"aaa\nbbb" |
テキストブロックの終わりの「"""」の直前には文字列が有っても良い。 (その場合、最終行の末尾は改行されない(\nが無い)) |
""" |
"aaabbb\n" |
行末に「\」を置くと、改行されずに行が継続される。 |
""" |
"" |
空文字列。 |
""" |
"\"a\"\n" |
テキストブロック内にダブルクォーテーションを含めたい場合、\でエスケープする必要は無い。 (敢えて「 \" 」と記述することも出来るが) |
""" |
||
""" |
"a\"\"\"\n" |
ただし、ダブルクォーテーション3つ「""" 」をテキストブロックの途中に記述することは出来ないので、その場合は\でエスケープする必要がある。 |
""" |
"aaa\r\n\nbbb\n" |
明示的に\r\nを記述した場合は、\nに変換されずにそのまま残る。 |
""" |
"aa\n bb\ncc\n" |
テキストブロック内の各行の先頭に空白(インデント)がある場合、インデントは削除される。 これは、一律に空白を除去するのではなく、最も空白が少ない行の空白文字数分の空白が各行から削除される。 この空白文字数のカウントには、末尾の「 """ 」しか無い行も含まれる。なお、空白とはスペース(\u0020)やタブ(\t)等のことであるが、全て(タブも)1文字として計算される。 (タブがスペース4文字分や8文字分であるといった考慮は無い) (String#stripIndentメソッド参照) |
""" |
"aaa\nbbb\n" |
テキストブロック内の各行の末尾に空白がある場合、その空白は削除される。 左記の例は、見ただけでは分からないがaaaとbbbの右側に空白がある^^; |
""" |
"aaa \nbbb \nccc \n" |
「\s」を置くと空白に変換される。 テキストブロック内の各行末の空白を残したい場合は、末尾に「\s」を置けばよい。 (行末にだけ置けば、それ以外の空白も残る) 行頭に「\s」を置いた場合も(インデントとして削除されずに)空白に変換される。 (行の途中に置いても空白になるが、行の途中には元々空白が書けるので、あまり意味は無いか) |
""" |
" aa\n b b\nc c\n" |
|
""" |
"$type v = null;".replace("$type", "Object") |
テキストブロックには文字列補間(string
interpolation)に該当する機能は無い。 String#replaceやformatあるいはformatted等を使って置換する。 |
String.format("%s v = null;", "Object") |
インデントの除去という処理がある理由は、インデントを含んだ文字列(プログラムの断片等)をテキストブロックで記述する場合、
Javaソースとしてのインデントが余分に入ってしまうので、それを除去する為だと思われる。
var html = """ <html> <body> <p>サンプル</p> </body> </html> """;
↓(実際の文字列)
"<html>\n <body>\n <p>サンプル</p>\n </body>\n</html>\n"
<html> <body> <p>サンプル</p> </body> </html>
改行コードの変換・インデントの除去・各行末の空白の除去といった処理はコンパイル時に行われるので、classファイルに含まれるのは処理後の文字列となる。