Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8331190

Implementation of Scoped Values (Third Preview)

XMLWordPrintable

    • Icon: CSR CSR
    • Resolution: Approved
    • Icon: P4 P4
    • 23
    • core-libs
    • None
    • minimal
    • Code using this preview API may need to be updated.
    • Java API
    • SE

      Summary

      Updates to preview API java.lang.ScopedValue for JDK 23. The API is proposed to continue as a preview API in this release.

      Problem

      The ScopedValue.callWhere(Callable) and ScopedValue.Carrier.call(Callable) methods take a java.util.concurrent.Callable operation but this is annoying to use because Callable.call throws Exception. The ScopedValue.getWhere(Supplier) and ScopedValue.Carrier.get(Supplier) were added to workaround this issue, thus creating two ways to invoke an operation that returns a result.

      Solution

      Change the parameter for ScopedValue.callWhere and ScopedValue.Carrier.call from Callable to a new functional interface that allows the compiler to infer the exception.

      Remove the ScopeValue.getWhere and ScopedValue.Carrier.get(Supplier) methods.

      More specifically, replace:

      ScopedValue.callWhere(ScopedValue, Object, Callable)
      ScopedValue.getWhere(ScopedValue, Object, Supplier)
      ScopedValue.Carrier.call(Callable)
      ScopedValue.Carrier.get(Supplier)

      with:

      ScopedValue.callWhere(ScopedValue, Object, ScopedValue.CallableOp)
      ScopedValue.Carrier.call(ScopedValue.CallableOp)

      where ScopedValue.CallableOp is a functional interface proposed as a preview API.

      /**
       * An operation that returns a result and may throw an exception.
       *
       * @param <T> result type of the operation
       * @param <X> type of the exception thrown by the operation
       * @since 23
       */
      @FunctionalInterface
      public interface CallableOp<T, X extends Throwable> {
          /**
           * Executes this operation.
           * @return the result, can be null
           * @throws X if the operation completes with an exception
           */
          T call() throws X;
       }

      Note that CallableOp is proposed as a nested class. Most usages of the callWhere are expected to use lambda expressions so it won't need to be imported. We do not propose to add this to java.util.function at this time.

      Specification

      Browsable API docs here: https://cr.openjdk.org/~alanb/sv-20240517/java.base/java/lang/ScopedValue.html

      A zip file with the specdiffs is attached although specdiff doesn't easily deal with the changes.

            alanb Alan Bateman
            alanb Alan Bateman
            Andrew Haley
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: