Interface Unwrappable

All Known Subinterfaces:
AnnotatedService, Backoff, BlockingWebClient, Client<I,O>, ClientFactory, ClientRequestContext, ConnectionPoolListener, GraphqlService, GrpcService, HttpClient, HttpService, HttpServiceWithRoutes, RequestContext, RequestContextStorage, RestClient, RpcClient, RpcService, RpcServiceWithRoutes, Service<I,O>, ServiceRequestContext, ServiceWithRoutes<I,O>, THttpClient, TransientHttpService, TransientRpcService, TransientService<I,O>, WebClient, WebSocketClient, WebSocketService
All Known Implementing Classes:
AbstractBackoff, AbstractCircuitBreakerClient, AbstractConcurrencyLimitingClient, AbstractGraphqlService, AbstractHttpService, AbstractRetryingClient, AbstractThrottlingService, AbstractUnaryGrpcService, AbstractUnsafeUnaryGrpcService, AbstractUnwrappable, AuthService, BackoffWrapper, BraveClient, BraveService, CircuitBreakerClient, CircuitBreakerRpcClient, ClientRequestContextWrapper, ConcurrencyLimitingClient, ConnectionPoolListenerAdapter, ConnectionPoolListenerWrapper, ContentPreviewingClient, ContentPreviewingService, CookieClient, CoroutineContextService, CorsService, DecodingClient, DecodingService, DecoratingClient, DecoratingClientFactory, DecoratingService, DocService, EncodingService, FileService, HealthCheckService, JettyService, LoggingClient, LoggingRpcClient, LoggingService, ManagementService, MetricCollectingClient, MetricCollectingRpcClient, MetricCollectingService, OAuth2Client, ObservationClient, ObservationService, PrometheusExpositionService, PrometheusExpositionService, RedirectService, RequestContextStorageWrapper, RequestContextWrapper, ResteasyService, RetryingClient, RetryingRpcClient, ServiceRequestContextWrapper, SimpleDecoratingClient, SimpleDecoratingHttpClient, SimpleDecoratingHttpService, SimpleDecoratingRpcClient, SimpleDecoratingRpcService, SimpleDecoratingService, ThriftCallService, ThrottlingRpcService, ThrottlingService, THttpService, TomcatService, UserClient

public interface Unwrappable
Provides a way to unwrap an object in decorator pattern, similar to down-casting in an inheritance pattern.
  • Method Summary

    Modifier and Type
    Method
    Description
    default <T> T
    as(Class<T> type)
    Unwraps this object into the object of the specified type.
    default boolean
    Reference checking this Unwrappable to another Unwrappable, ignoring wrappers.
    default Unwrappable
    Unwraps this object and returns the object being decorated.
    default Object
    Unwraps this object and returns the innermost object being decorated.
  • Method Details

    • as

      @Nullable default <T> T as(Class<T> type)
      Unwraps this object into the object of the specified type. Use this method instead of an explicit downcast. For example:
      
       class Foo {}
      
       class Bar<T> extends AbstractWrapper<T> {
           Bar(T delegate) {
               super(delegate);
           }
       }
      
       class Qux<T> extends AbstractWrapper<T> {
           Qux(T delegate) {
               super(delegate);
           }
       }
      
       Qux qux = new Qux(new Bar(new Foo()));
       Foo foo = qux.as(Foo.class);
       Bar bar = qux.as(Bar.class);
       
      Parameters:
      type - the type of the object to return
      Returns:
      the object of the specified type if found, or null if not found.
    • unwrap

      default Unwrappable unwrap()
      Unwraps this object and returns the object being decorated. If this Unwrappable is the innermost object, this method returns itself. For example:
      
       class Foo implements Unwrappable {}
      
       class Bar<T extends Unwrappable> extends AbstractUnwrappable<T> {
           Bar(T delegate) {
               super(delegate);
           }
       }
      
       class Qux<T extends Unwrappable> extends AbstractUnwrappable<T> {
           Qux(T delegate) {
               super(delegate);
           }
       }
      
       Foo foo = new Foo();
       assert foo.unwrap() == foo;
      
       Bar<Foo> bar = new Bar<>(foo);
       assert bar.unwrap() == foo;
      
       Qux<Bar<Foo>> qux = new Qux<>(bar);
       assert qux.unwrap() == bar;
       assert qux.unwrap().unwrap() == foo;
       
    • unwrapAll

      @UnstableApi default Object unwrapAll()
      Unwraps this object and returns the innermost object being decorated. If this Unwrappable is the innermost object, this method returns itself. For example:
      
       class Foo implements Unwrappable {}
      
       class Bar<T extends Unwrappable> extends AbstractUnwrappable<T> {
           Bar(T delegate) {
               super(delegate);
           }
       }
      
       class Qux<T extends Unwrappable> extends AbstractUnwrappable<T> {
           Qux(T delegate) {
               super(delegate);
           }
       }
      
       Foo foo = new Foo();
       assert foo.unwrapAll() == foo;
      
       Bar<Foo> bar = new Bar<>(foo);
       assert bar.unwrapAll() == foo;
      
       Qux<Bar<Foo>> qux = new Qux<>(bar);
       assert qux.unwrap() == bar;
       assert qux.unwrapAll() == foo;
       
    • equalsIgnoreWrapper

      @UnstableApi default boolean equalsIgnoreWrapper(@Nullable @Nullable Unwrappable other)
      Reference checking this Unwrappable to another Unwrappable, ignoring wrappers. Two Unwrappable are considered equal ignoring wrappers if they are of the same object reference after unwrapAll().
      Parameters:
      other - The Unwrappable to compare this Unwrappable against
      Returns:
      true if the argument is not null, and it represents a same object reference after unwrapAll(), false otherwise.