1 /* 2 * Copyright (C) 2014 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.inject.multibindings; 18 19 import com.google.inject.Binding; 20 import com.google.inject.Key; 21 import com.google.inject.spi.Element; 22 import com.google.inject.spi.Elements; 23 24 /** 25 * A binding for a OptionalBinder. 26 * 27 * <p>Although OptionalBinders may be injected through a variety of types {@code T}, {@code 28 * Optional<T>}, {@code Optional<Provider<T>>}, etc..), an OptionalBinderBinding exists only on the 29 * Binding associated with the {@code Optional<T>} key. Other bindings can be validated to be 30 * derived from this OptionalBinderBinding using {@link #containsElement}. 31 * 32 * @param <T> The fully qualified type of the optional binding, including Optional. For example: 33 * {@code Optional<String>}. 34 * @since 4.0 35 * @author sameb@google.com (Sam Berlin) 36 */ 37 public interface OptionalBinderBinding<T> { 38 39 /** Returns the {@link Key} for this binding. */ getKey()40 Key<T> getKey(); 41 42 /** 43 * Returns the default binding (set by {@link OptionalBinder#setDefault}) if one exists or null if 44 * no default binding is set. This will throw {@link UnsupportedOperationException} if it is 45 * called on an element retrieved from {@link Elements#getElements}. 46 * 47 * <p>The Binding's type will always match the type Optional's generic type. For example, if 48 * getKey returns a key of <code>Optional<String></code>, then this will always return a <code> 49 * Binding<String></code>. 50 */ getDefaultBinding()51 Binding<?> getDefaultBinding(); 52 53 /** 54 * Returns the actual binding (set by {@link OptionalBinder#setBinding}) or null if not set. This 55 * will throw {@link UnsupportedOperationException} if it is called on an element retrieved from 56 * {@link Elements#getElements}. 57 * 58 * <p>The Binding's type will always match the type Optional's generic type. For example, if 59 * getKey returns a key of <code>Optional<String></code>, then this will always return a <code> 60 * Binding<String></code>. 61 */ getActualBinding()62 Binding<?> getActualBinding(); 63 64 /** 65 * Returns true if this OptionalBinder contains the given Element in order to build the optional 66 * binding or uses the given Element in order to support building and injecting its data. This 67 * will work for OptionalBinderBinding retrieved from an injector and {@link 68 * Elements#getElements}. Usually this is only necessary if you are working with elements 69 * retrieved from modules (without an Injector), otherwise {@link #getDefaultBinding} and {@link 70 * #getActualBinding} are better options. 71 */ containsElement(Element element)72 boolean containsElement(Element element); 73 } 74