Class Multibinder.RealMultibinder<T>

  • All Implemented Interfaces:
    Module, Provider<java.util.Set<T>>, HasDependencies
    Enclosing class:
    Multibinder<T>

    public static final class Multibinder.RealMultibinder<T>
    extends Multibinder<T>
    implements Module, Provider<java.util.Set<T>>, HasDependencies
    The actual multibinder plays several roles:

    As a Multibinder, it acts as a factory for LinkedBindingBuilders for each of the set's elements. Each binding is given an annotation that identifies it as a part of this set.

    As a Module, it installs the binding to the set itself. As a module, this implements equals() and hashcode() in order to trick Guice into executing its configure() method only once. That makes it so that multiple multibinders can be created for the same target collection, but only one is bound. Since the list of bindings is retrieved from the injector itself (and not the multibinder), each multibinder has access to all contributions from all multibinders.

    As a Provider, this constructs the set instances.

    We use a subclass to hide 'implements Module, Provider' from the public API.

    • Method Detail

      • configure

        public void configure​(Binder binder)
        Description copied from interface: Module
        Contributes bindings and other configurations for this module to binder.

        Do not invoke this method directly to install submodules. Instead use Binder.install(Module), which ensures that provider methods are discovered.

        Specified by:
        configure in interface Module
      • addBinding

        public LinkedBindingBuilder<T> addBinding()
        Description copied from class: Multibinder
        Returns a binding builder used to add a new element in the set. Each bound element must have a distinct value. Bound providers will be evaluated each time the set is injected.

        It is an error to call this method without also calling one of the to methods on the returned binding builder.

        Scoping elements independently is supported. Use the in method to specify a binding scope.

        Specified by:
        addBinding in class Multibinder<T>
      • initialize

        @Inject
        public void initialize​(Injector injector)
        Invoked by Guice at Injector-creation time to prepare providers for each element in this set. At this time the set's size is known, but its contents are only evaluated when get() is invoked.
      • get

        public java.util.Set<T> get()
        Description copied from interface: Provider
        Provides an instance of T. Must never return null.
        Specified by:
        get in interface Provider<T>
      • getDependencies

        public java.util.Set<Dependency<?>> getDependencies()
        Description copied from interface: HasDependencies
        Returns the known dependencies for this type. If this has dependencies whose values are not known statically, a dependency for the Injector will be included in the returned set.
        Specified by:
        getDependencies in interface HasDependencies
        Returns:
        a possibly empty set
      • equals

        public boolean equals​(java.lang.Object o)
        Overrides:
        equals in class java.lang.Object
      • hashCode

        public int hashCode()
        Overrides:
        hashCode in class java.lang.Object
      • toString

        public java.lang.String toString()
        Overrides:
        toString in class java.lang.Object