Javaテキストブロックにちょい足し(Lambig)

こんにちは、株式会社クラス システム開発本部 Lambigです。
テックブログなればそれっぽい記事があらまほしく、簡単に物してみます。
バックエンドの技術スタックに合わせ、Javaでひとネタ。

Java15でテキストブロックという機能が(正式に)追加されました。
LTSベースだと2021/09のJava17からなので、
まだ使ったことがない方もそれなりにいるはず。

この機能はPHPのヒアドキュメントやJavaScriptのテンプレートリテラル同様、複数行の文字列がそのまま入力できる機能です。

System.out.println("""
This is the first line
This is the second line
This is the third line
""");

https://docs.oracle.com/javase/jp/15/text-blocks/index.html

このように。喜ばしいことです。で、一応変数の利用も可能です。

String output = """
Name: %s
Phone: %s
Address: %s
Salary: $%.2f
""".formatted(name, phone, address, salary);

https://docs.oracle.com/javase/jp/15/text-blocks/index.html#string-methods-related-to-text-blocks

えっ……と、うーん、順番ベースなのか……大時代だな……
これ普通に古き良きJavaってかC式のformatだな……
ちょっと気に入らないですが、「気に入らない」はライブラリの母、
より気に入るようになるライブラリを書きま

した。

使い心地はこのような感じ。

String output = escape("""
Name: ${name}
Phone: ${phone}
Address: ${address}
Salary: ${salary}
""").where(Map.of( // ここで変換のマッピングを定義する
  "name", name, // 上記の${name}を置換する。JavaScriptスタイル。
  "phone", phone,
  "address", address,
  "salary", salary
));

一応、テキストブロックが利用できないバージョンのJava(11+)も
サポートするよう作ってはあり、以下のようにも使えます。

String output = escape(
"Name: ${name}",
"Phone: ${phone}",
"Address: ${address}",
"Salary: ${salary}")
.where(Map.of(
  "name", name,
  "phone", phone))
.where("address", address) // こういう風に変数を宣言することもできる
.where("salary", salary) 
));

変数宣言が多少長ったらしいですが、
名前ベースでのエスケープができるようになりました。
(スコープ内の変数にアノテーション付けて
何とかできないかなとか思ったものの、値の追跡が大変そうだし
できたとしてコスト負けしそうだったのでやめ)

再帰適用のような凝ったことはできませんが、
たとえば何か事情があって生のSQLクエリが書きたいケースなどでは
そこそこ便利なんじゃないでしょうか。

先のライブラリはこちらのバンドルにも含まれています。
基本的に気持ちよく実装できることばかりを考えており、
そういうライブラリの詰め合わせです。

ライブラリ自体は個人的に開発したものなので、
そのフィードバックはこちらへ

記事へのフィードバックはコメントにお願いします。

エンジニア募集のお知らせ


現在、クラスではエンジニアを募集中です!
ご興味がある方はお気軽にカジュアル面談をお申し込みください。

▼面談のご応募はこちらから
https://herp.careers/v1/clas/YV-LL65HZJWd

▼採用情報はこちらから
https://clas.style/company/recruit/

この記事が気に入ったらサポートをしてみませんか?