文字列テンプレート(JEP459 - JDK23で廃止)
文字列テンプレートはJava21にもPreview版としてあったので、当時の解説記事でも紹介しました。文字列内に変数の値を簡単に差し込めるようにするための新たなJavaの記述方法です。デバッグ時など、HTMLやJSON、SQLといった汎用的なフォーマットを限定的に、簡単に使いたい場合に、魅力的な機能でした。
しかし、Java23では完全になくなってしまいました。つまり、Java22まではpreview機能としてコンパイルし実行はできたのですが、Java23ではpreview機能としても存在しません。
理由にはさまざまなことがあるようです。文字列テンプレートの思想としては、さまざな用途に応じたテンプレート処理プロセッサが実装できるようになっていて、多様な用途に使える仕様を目指していました。しかし、サードパーティー製のライブラリが提供する似た機能のシンタックスシュガーと同じようになり、開発者はどちらを使うべきかわかりにくい面もありました。
特に、SQLなどを扱う場合のPreparedStatementの使い分けや、エスケープ文字のエスケープなども考慮しなくてはいけないため、正しい処理プロセッサを選ばないと危険なコードを生む原因になります。簡単に利用できることが、必ずしもよいソリューションとは言えない部分もあったのだろうと思います。
preview機能もなくなってしまったことからも、文字列テンプレートはこの考え方のまま、今後も復活することはないと思われます。詳しい背景を知りたい方は、こちらのメーリングリストなどを参照してください。
その他の注目すべき変更
筆者が本記事で挙げたもの以外に注目している機能として「構造化された並列処理に関するAPI(JEP480)」があります。こちらの機能はProject Loomとして追加された機能です。
この機能は、新しく追加されたStructuredTaskScopeクラスによって提供されます。例えば、複数同じ処理を実行して、最も早く結果を取得できたものを採用し、それ以外の処理は中断したい場合に利用できます。
この機能がPreview版として追加されたのはJava21であり、Java23でもPreview版として継続して同じ形として残っています。そのため、Java22やJava23で新規に追加された機能ではありませんが、次のLTSリリースには含まれると思われ、そのときには使い方を含めて紹介したい機能の1つです。
最後に
これまでのJavaは、「曖昧になりやすい場合があれば、多少不便さやわかりにくさがあってもより明確で安全なコードであることを言語仕様レベルで保証できる」といった方向性を選んできたように思います。例えば、コンストラクタの制限などがその典型例です。「意味的に問題ない場合もあれば、問題が生じるケースがある場合、文法レベルで禁止したほうがいい」というのが、これまでのJavaの考え方です。そして、多くのJava開発者にとってコーディングに生じる面倒や難解さを解決してくれるIDEを前提としていたと思います。
しかし、Javaがさまざまな場所で使われるようになってきた結果、システム都合の制約やあるべき論が開発者の負担にならないように、より手軽に書きたい(=人が考えやすい自然な理解でコーディングしたい)という方向へと、軸足を移してきたように感じます。このような流れが、Java開発者の裾野を広げることに役立ってくれればと思います。