@Documented
@Beta
@Retention(value=RUNTIME)
@Target(value=METHOD)
public @interface BindsOptionalOf
Optional containers of values from bindings
that may or may not be present in the component.
If a module contains a method declaration like this:
@BindsOptionalOf abstract Foo optionalFoo();then any binding in the component can depend on an
Optional of Foo. If there is
no binding for Foo in the component, the Optional will be absent. If there is a
binding for Foo in the component, the Optional will be present, and its value
will be the value given by the binding for Foo.
A @BindsOptionalOf method:
abstract
void
@Inject-annotated constructor,
since such a type is always present
Other bindings may inject any of:
Optional<Foo> (unless there is a @Nullable binding for Foo; see
below)
Optional<Provider<Foo>>
Optional<Lazy<Foo>>
Optional<Provider<Lazy<Foo>>>
If there is a binding for Foo, and that binding is @Nullable, then it is a
compile-time error to inject Optional<Foo>, because Optional cannot contain
null. You can always inject the other forms, because Provider and Lazy
can always return null from their get() methods.
Explicit bindings for any of the above will conflict with a @BindsOptionalOf binding.
If the binding for Foo is a @Produces binding, then another @Produces
binding can depend on any of:
Optional<Foo>
Optional<Producer<Foo>>
Optional<Produced<Foo>>
You can inject either com.google.common.base.Optional or java.util.Optional.