@Beta
public interface Producer<T>
T. You can also inject
 Producer<T> instead of T, which will delay the execution of any code that
 produces the T until get() is called.
 For example, you might inject Producer to lazily choose between several different
 implementations of some type: 
    @Produces ListenableFuture<Heater> getHeater(
       HeaterFlag flag,
        @Electric Producer<Heater> electricHeater,
        @Gas Producer<Heater> gasHeater) {
     return flag.useElectricHeater() ? electricHeater.get() : gasHeater.get();
   }
 Here is a complete example that demonstrates how calling get() will cause each
 method to be executed: 
    @ProducerModule
   final class MyModule {
      @Produces ListenableFuture<A> a() {
       System.out.println("a");
       return Futures.immediateFuture(new A());
     }
      @Produces ListenableFuture<B> b(A a) {
       System.out.println("b");
       return Futures.immediateFuture(new B(a));
     }
      @Produces ListenableFuture<C> c(B b) {
       System.out.println("c");
       return Futures.immediateFuture(new C(b));
     }
      @Produces @Delayed ListenableFuture<C> delayedC(A a,  Producer<C> c) {
       System.out.println("delayed c");
       return c.get();
     }
   }
    @ProductionComponent(modules = MyModule.class)
   interface MyComponent {
      @Delayed ListenableFuture<C> delayedC();
   }
 delayedC(): 
   MyComponent component = DaggerMyComponent
       .builder()
       .executor(MoreExecutors.directExecutor())
       .build();
   System.out.println("Constructed component");
    ListenableFuture<C> cFuture = component.delayedC();
   System.out.println("Retrieved future");
   C c = cFuture.get();
   System.out.println("Retrieved c");
 MoreExecutors.directExecutor in order to illustrate how each call
 directly causes code to execute. The above code will print: 
   Constructed component
   a
   delayed c
   b
   c
   Retrieved future
   Retrieved c
 | Modifier and Type | Method and Description | 
|---|---|
| ListenableFuture<T> | get()Returns a future representing a running task that produces a value. | 
@CheckReturnValue ListenableFuture<T> get()
T will be submitted to the executor, as their dependencies become available.
 If the key is bound to a Produces method, then calling this method multiple times
 will return the same future.
Copyright © 2012–2017 The Dagger Authors. All rights reserved.