JavaのText Blocksに慣れる

この記事は GMOアドマーケティング Advent Calendar 2020 16日目の記事です。

GMOアドマーケティングのT.Nです。

Java 15でText BlocksがPreviewからStandardになりました。

前回のブログでは、Switch Expressionsについて書きました。
Text Blocksについても、既に多くの記事や説明が存在すると思いますが、
今回も同じように、Text Blocksに慣れるためにソースコードを書いて動かしてみました。

Text Blocksとは

Text Blocksを使うと、文字列を複数行で書くことができます。

出力すると以下のようになります。

コンパイルすると以下のようになります。

閉じる"""の一番左の"の位置を基準にしてインデントの開始位置が決まるようです。
そのことは、以下の文字列を出力するとよく分かります。

ソースコード

出力結果

一番左の"の開始位置が文字の開始位置より右にある場合は、
一番左の文字の位置が開始位置になります。

以下の例では、GMOのGの位置が開始位置になります。

ソースコード

出力結果

閉じる"""は以下のように最後の行の後ろに書くこともできます。
その場合は最後の行に改行が入りません。

ちなみに、以下のように書くとコンパイルエラーになります。

コンパイル時の処理

JEP 378のCompile-time processingの部分に書かれている内容を参考に、
コンパイル時の処理をまとめました。

コンパイル時には主に以下の三つの処理が行われます。

  1. 行末を改行文字にする
  2. 不要なホワイトスペースを除去する
  3. エスケープシーケンスを解釈する

1. 行末を改行文字にする

先ほどの例でも示しましたが、コンパイル時に各行の後ろに改行文字が入ります。

ソースコード

コンパイル結果

2. 不要なホワイトスペースを除去する

以下の例では、各行の文字の後ろにスペースが4つずつ入っていますが、
コンパイル時に除去されます。

ソースコード

コンパイル結果

3. エスケープシーケンスを解釈する

以下の例では、GMOアドマーケティングの文字が"で囲ってあり、
Advent Calendarの文字の前にはタブが入っていますが、
コンパイル時に変換されます。

ソースコード

コンパイル結果

"\"に、タブは\tに変換されています。

""もブロックの中で使用できますが、
"""をブロックの中で使用する場合は、以下のように一番右の"をエスケープする必要があります。

ソースコード

コンパイル結果

新しいエスケープシーケンス

以下の二つのエスケープシーケンスを新しく使用できるようになりました。

  • \

コンパイル時に行末に改行が入りますが、
改行を入れたくない場合は、行末に\を入れると改行されません。

ソースコード

コンパイル結果

  • \s

コンパイル時に行末のスペースは除去されますが、
\sを書くと、行末にスペースを入れることができます。

ソースコード

コンパイル結果

まとめ

Text Blocksという機能を初めて見た時は、
ただ文字列を複数行で書くことができるだけのものだと思っていましたが、
実際に使ってみることで、
インデントの規則やコンパイル時の処理などの詳細な仕様に気づくことができました。

明日は、zakisanbaimanさんによる「JavaコードをGCPのCloud Profilerで分析してみる」です。
引き続き、GMOアドマーケティング Advent Calendar 2020 をお楽しみください!
■エンジニア採用ページ ~福利厚生や各種制度のご案内はこちら~
https://www.gmo-ap.jp/engineer/
■noteページ ~ブログや採用、イベント情報を公開中!~
https://note.gmo-ap.jp/