Java 20がリリースされました。今回は小規模な変更に留まっているようです。まったく新しく導入された機能はScoped Valuesのみで,他は2回目以降のインキュベーターまたはプレビューとしての更新です。
- Scoped Values (JEP-429)
- レコードパターン (JEP-432)
- switch文のパターンマッチ (JEP-433)
- 外部メモリ/ファンクションAPI (JEP-434)
- 仮想スレッド (JEP-436)
- 構造化同時実行 (JEP-437)
Scoped Values
大規模プログラムにおいて,コンポーネント間で安全かつ効率的にデータを共有するための新たなメカニズムのようです。ScopedValue<T>というクラスが導入されています。Javaでは変数のスコープはクラスやメソッド,ブロックなどで定義される静的なスコープでしたが,今回導入されたスコープは動的なものです。
以下の例ではScopedValue<>型のstatic変数PRINCIPALを用いて,ServerクラスからDBAccessクラスへデータを共有させています。Serverクラスの(1)の部分で作成されたオブジェクトをDBAccesクラスの(3)の部分で読み取ることができるようになるというもののようです。Webサーバへアクセスしてきたユーザにデータベース接続権限がなかった場合は例外をスローするということが,メソッド呼出の際に権限情報を渡さずとも実現できるということでしょうか・・・。
class Server {
final static ScopedValue<Principal> PRINCIPAL = new ScopedValue<>(); // (1)
void serve(Request request, Response response) {
var level = (request.isAdmin() ? ADMIN : GUEST);
var principal = new Principal(level);
ScopedValue.where(PRINCIPAL, principal) // (2)
.run(() -> Application.handle(request, response));
}
}
class DBAccess {
DBConnection open() {
var principal = Server.PRINCIPAL.get(); // (3)
if (!principal.canOpen()) throw new InvalidPrincipalException();
return newConnection(...);
}
}