この記事は GMOアドマーケティング Advent Calendar 2020 16日目の記事です。
GMOアドマーケティングのT.Nです。
Java 15でText BlocksがPreviewからStandardになりました。
前回のブログでは、Switch Expressionsについて書きました。
Text Blocksについても、既に多くの記事や説明が存在すると思いますが、
今回も同じように、Text Blocksに慣れるためにソースコードを書いて動かしてみました。
Text Blocksとは
Text Blocksを使うと、文字列を複数行で書くことができます。
1 2 3 4 |
String text = """ GMOアドマーケティング Advent Calendar 2020 """; |
出力すると以下のようになります。
1 2 |
GMOアドマーケティング Advent Calendar 2020 |
コンパイルすると以下のようになります。
1 |
String text = "GMOアドマーケティング\n Advent Calendar 2020\n"; |
閉じる"""
の一番左の"
の位置を基準にしてインデントの開始位置が決まるようです。
そのことは、以下の文字列を出力するとよく分かります。
ソースコード
1 2 3 4 |
String text = """ GMOアドマーケティング Advent Calendar 2020 """; |
出力結果
1 2 |
GMOアドマーケティング Advent Calendar 2020 |
一番左の"
の開始位置が文字の開始位置より右にある場合は、
一番左の文字の位置が開始位置になります。
以下の例では、GMOのGの位置が開始位置になります。
ソースコード
1 2 3 4 |
String text = """ GMOアドマーケティング Advent Calendar 2020 """; |
出力結果
1 2 |
GMOアドマーケティング Advent Calendar 2020 |
閉じる"""
は以下のように最後の行の後ろに書くこともできます。
その場合は最後の行に改行が入りません。
1 2 3 |
String text = """ GMOアドマーケティング Advent Calendar 2020"""; |
ちなみに、以下のように書くとコンパイルエラーになります。
1 |
String text = """ GMOアドマーケティング Advent Calendar 2020"""; |
コンパイル時の処理
JEP 378のCompile-time processingの部分に書かれている内容を参考に、
コンパイル時の処理をまとめました。
コンパイル時には主に以下の三つの処理が行われます。
- 行末を改行文字にする
- 不要なホワイトスペースを除去する
- エスケープシーケンスを解釈する
1. 行末を改行文字にする
先ほどの例でも示しましたが、コンパイル時に各行の後ろに改行文字が入ります。
ソースコード
1 2 3 4 |
String text = """ GMOアドマーケティング Advent Calendar 2020 """; |
コンパイル結果
1 |
String text = "GMOアドマーケティング\n Advent Calendar 2020\n"; |
2. 不要なホワイトスペースを除去する
以下の例では、各行の文字の後ろにスペースが4つずつ入っていますが、
コンパイル時に除去されます。
ソースコード
1 2 3 4 |
String text = """ GMOアドマーケティング Advent Calendar 2020 """; |
コンパイル結果
1 |
String text = "GMOアドマーケティング\n Advent Calendar 2020\n"; |
3. エスケープシーケンスを解釈する
以下の例では、GMOアドマーケティングの文字が"
で囲ってあり、
Advent Calendarの文字の前にはタブが入っていますが、
コンパイル時に変換されます。
ソースコード
1 2 3 4 |
String text = """ "GMOアドマーケティング" Advent Calendar '2020' """; |
コンパイル結果
1 |
String text = "\"GMOアドマーケティング\"\n\tAdvent Calendar '2020'\n"; |
"
は\"
に、タブは\t
に変換されています。
""
もブロックの中で使用できますが、
"""
をブロックの中で使用する場合は、以下のように一番右の"
をエスケープする必要があります。
ソースコード
1 2 3 4 |
String text = """ ""\"GMOアドマーケティング""\" Advent Calendar ""2020"" """; |
コンパイル結果
1 |
String text = "\"\"\"GMOアドマーケティング\"\"\"\n\tアドベントカレンダー \"\"2020\"\"\n"; |
新しいエスケープシーケンス
以下の二つのエスケープシーケンスを新しく使用できるようになりました。
\
コンパイル時に行末に改行が入りますが、
改行を入れたくない場合は、行末に\
を入れると改行されません。
ソースコード
1 2 3 4 |
String text = """ GMOアドマーケティング\ Advent Calendar 2020\ """; |
コンパイル結果
1 |
String text = "GMOアドマーケティング Advent Calendar 2020"; |
\s
コンパイル時に行末のスペースは除去されますが、
\s
を書くと、行末にスペースを入れることができます。
ソースコード
1 2 3 4 |
String text = """ GMOアドマーケティング \s Advent Calendar 2020 \s """; |
コンパイル結果
1 |
String text = "GMOアドマーケティング \n Advent Calendar 2020 \n"; |
まとめ
Text Blocksという機能を初めて見た時は、
ただ文字列を複数行で書くことができるだけのものだと思っていましたが、
実際に使ってみることで、
インデントの規則やコンパイル時の処理などの詳細な仕様に気づくことができました。
明日は、zakisanbaimanさんによる「JavaコードをGCPのCloud Profilerで分析してみる」です。
引き続き、GMOアドマーケティング Advent Calendar 2020 をお楽しみください!
■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://www.gmo-ap.jp/engineer/
■noteページ ~ブログや採用、イベント情報を公開中!~
https://note.gmo-ap.jp/