Interface Unwrappable

All Known Subinterfaces:
Backoff, Client<I,​O>, ClientFactory, ConnectionPoolListener, GrpcService, HttpClient, HttpService, HttpServiceWithRoutes, RequestContextStorage, RpcClient, RpcService, RpcServiceWithRoutes, Service<I,​O>, ServiceWithRoutes<I,​O>, THttpClient, TransientHttpService, TransientRpcService, TransientService<I,​O>, WebClient
All Known Implementing Classes:
AbstractBackoff, AbstractCircuitBreakerClient, AbstractConcurrencyLimitingClient, AbstractHttpService, AbstractRetryingClient, AbstractThrottlingService, AbstractUnaryGrpcService, AbstractUnsafeUnaryGrpcService, AbstractUnwrappable, AuthService, BackoffWrapper, BraveClient, BraveService, CircuitBreakerClient, CircuitBreakerRpcClient, ConcurrencyLimitingClient, ConnectionPoolListenerAdapter, ConnectionPoolListenerWrapper, ConnectionPoolLoggingListener, ContentPreviewingClient, ContentPreviewingService, CorsService, DecodingClient, DecoratingClient, DecoratingClientFactory, DecoratingService, DocService, EncodingService, FileService, HealthCheckService, JettyService, LoggingClient, LoggingRpcClient, LoggingService, MetricCollectingClient, MetricCollectingRpcClient, MetricCollectingService, PrometheusExpositionService, RedirectService, RequestContextStorageWrapper, RetryingClient, RetryingRpcClient, 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 Unwrappable unwrap()
    Unwraps this object and returns the 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;