4.19. スコープ付きの値 (プレビュー)
Red Hat build of OpenJDK 21 では、スコープ値が導入されています。これは、scoped value 変数をサポートする API を提供するプレビュー機能です。通常、scoped value 変数は、多くのメソッドからアクセスできる最終的な静的フィールドとして宣言されます。
scoped value は、メソッドパラメーターを使用せずにメソッド間で変数を共有する安全で効率的な方法を提供します。scoped value は、メソッド自体でパラメーターを宣言しなくてもメソッドが使用できる暗黙的なメソッドパラメーターに相当します。scoped value オブジェクトにアクセスできるメソッドのみがそのデータにアクセスできます。scoped value を使用すると、アプリケーションは、このデータのパラメーターを宣言せず、そのデータにアクセスできない他の中間メソッドを介して、呼び出し元から呼び出し先にデータを安全に渡すことができます。scoped value は、特に多数の仮想スレッドを使用する場合に、thread-local 変数の代わりとして推奨されます。
呼び出し先メソッド (bar
) がネストされたバインディング内にある同じ scoped value を使用して、別の呼び出し先メソッド (baz
) に異なる値を送信できる次のコード例を見てみましょう。
private static final ScopedValue<String> X = ScopedValue.newInstance(); void main() { ScopedValue.where(X, "hello").run(() -> bar()); } void bar() { System.out.println(X.get()); // prints hello ScopedValue.where(X, "goodbye").run(() -> baz()); System.out.println(X.get()); // prints hello } void baz() { System.out.println(X.get()); // prints goodbye }
private static final ScopedValue<String> X = ScopedValue.newInstance();
void main() {
ScopedValue.where(X, "hello").run(() -> bar());
}
void bar() {
System.out.println(X.get()); // prints hello
ScopedValue.where(X, "goodbye").run(() -> baz());
System.out.println(X.get()); // prints hello
}
void baz() {
System.out.println(X.get()); // prints goodbye
}
前の例では、main()
メソッドは scoped value X
を hello
に設定し、この値を bar()
メソッドに送信します。bar()
メソッドは hello
(X
の値) を出力し、ネストされたバインディングを使用して X
の値を変更し、変更された値を baz()
メソッドに送信します。baz()
メソッドが戻ると、bar()
メソッドの残りの部分には、X
の元の hello
値が残ります。
詳細は、JEP 446: Scoped Values (Preview) を参照してください。