ScopedValue — 스코프 값 클래스

ScopedValue — 스코프 값 클래스

ScopedValue는 메서드 매개변수를 사용하지 않고도 메서드에 안전하고 효율적으로 공유할 수 있는 값이에요. 자바 프로그래밍 언어에서 데이터는 보통 메서드 매개변수로 메서드에 전달돼요. 데이터는 그 데이터를 사용하는 메서드에 도달하기 위해 여러 메서드를 거치는 연속 호출을 통과해야 할 수 있어요. 호출 연속의 모든 메서드는 매개변수를 선언해야 하고 모든 메서드는 데이터에 접근할 수 있어요. ScopedValue는 메서드 매개변수를 사용하지 않고 먼 곳의 메서드(보통 콜백)에 데이터를 전달하는 수단을 제공해요. 사실상 ScopedValue는 암묵적 메서드 매개변수예요. 호출 연속의 모든 메서드가 추가 매개변수를 갖는 것처럼 동작해요. 어떤 메서드도 그 매개변수를 선언하지 않아요.

출처: Java API Reference

본문

public static <T> ScopedValue.CarrierPREVIEW where(ScopedValuePREVIEW<T> key, T value) — 지정된 키에 값을 바인딩한 Carrier를 만들고, run이나 call로 스코프를 지정해 실행해요. 이 메서드는 여러 스코프 값 바인딩을 조합하는 데 사용해요.

public static <T, R> R callWhere(ScopedValuePREVIEW<T> key, T value, Callable<R> op) — 주어진 콜러블을 실행하는 동안 키에 값을 바인딩하고 그 결과를 반환해요.

public static <T, R> R getWhere(ScopedValuePREVIEW<T> key, T value, Supplier<R> op) — 주어진 서플라이어를 실행하는 동안 키에 값을 바인딩하고 결과를 반환해요.

public static <T> void runWhere(ScopedValuePREVIEW<T> key, T value, Runnable op) — 주어진 러너블을 실행하는 동안 키에 값을 바인딩해요.

public static <T> ScopedValuePREVIEW<T> newInstance() — 이 ScopedValue 인스턴스가 각 실행 스레드에서 고유한 키로 사용될 수 있게 만들어요. 이 키의 바인딩은 서로 다른 스레드와 별개로 독립적이에요.

public T get() — 이 스코프 값의 현재 바인딩된 값을 반환해요. 바인딩되어 있지 않으면 NoSuchElementException을 던져요.

public boolean isBound() — 이 스코프 값이 현재 스레드에 바인딩되어 있으면 true를 반환해요.

public T orElse(T other) — 바인딩되어 있으면 그 값을, 그렇지 않으면 other를 반환해요.

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) — 바인딩되어 있으면 값을, 그렇지 않으면 서플라이어가 만든 예외를 던져요.

ScopedValue는 스레드 로컬(ThreadLocal)과 달리 불변성을 갖고, 설정된 범위(동적 스코프) 안에서만 유효하며, 스레드 풀과 구조적 동시성(structured concurrency)에서 안전하게 사용돼요. 미리 보기(Preview) API로 PREVIEW 마커가 붙어 있어요.

더 알아보기 (Learn more)