1*f585d8a3SJacky Wang /* 2*f585d8a3SJacky Wang * Copyright (C) 2017 The Dagger Authors. 3*f585d8a3SJacky Wang * 4*f585d8a3SJacky Wang * Licensed under the Apache License, Version 2.0 (the "License"); 5*f585d8a3SJacky Wang * you may not use this file except in compliance with the License. 6*f585d8a3SJacky Wang * You may obtain a copy of the License at 7*f585d8a3SJacky Wang * 8*f585d8a3SJacky Wang * http://www.apache.org/licenses/LICENSE-2.0 9*f585d8a3SJacky Wang * 10*f585d8a3SJacky Wang * Unless required by applicable law or agreed to in writing, software 11*f585d8a3SJacky Wang * distributed under the License is distributed on an "AS IS" BASIS, 12*f585d8a3SJacky Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*f585d8a3SJacky Wang * See the License for the specific language governing permissions and 14*f585d8a3SJacky Wang * limitations under the License. 15*f585d8a3SJacky Wang */ 16*f585d8a3SJacky Wang 17*f585d8a3SJacky Wang package dagger.internal; 18*f585d8a3SJacky Wang 19*f585d8a3SJacky Wang import static dagger.internal.Preconditions.checkNotNull; 20*f585d8a3SJacky Wang 21*f585d8a3SJacky Wang import java.util.ArrayList; 22*f585d8a3SJacky Wang import java.util.Collection; 23*f585d8a3SJacky Wang import java.util.Collections; 24*f585d8a3SJacky Wang import java.util.HashSet; 25*f585d8a3SJacky Wang import java.util.List; 26*f585d8a3SJacky Wang import java.util.Set; 27*f585d8a3SJacky Wang 28*f585d8a3SJacky Wang /** 29*f585d8a3SJacky Wang * A fluent builder class that returns a {@link Set}. Used in component implementations where a set 30*f585d8a3SJacky Wang * must be created in one fluent statement for inlined request fulfillments. 31*f585d8a3SJacky Wang */ 32*f585d8a3SJacky Wang public final class SetBuilder<T> { 33*f585d8a3SJacky Wang private static final String SET_CONTRIBUTIONS_CANNOT_BE_NULL = 34*f585d8a3SJacky Wang "Set contributions cannot be null"; 35*f585d8a3SJacky Wang private final List<T> contributions; 36*f585d8a3SJacky Wang SetBuilder(int estimatedSize)37*f585d8a3SJacky Wang private SetBuilder(int estimatedSize) { 38*f585d8a3SJacky Wang contributions = new ArrayList<>(estimatedSize); 39*f585d8a3SJacky Wang } 40*f585d8a3SJacky Wang 41*f585d8a3SJacky Wang /** 42*f585d8a3SJacky Wang * {@code estimatedSize} is the number of bindings which contribute to the set. They may each 43*f585d8a3SJacky Wang * provide {@code [0..n)} instances to the set. Because the final size is unknown, {@code 44*f585d8a3SJacky Wang * contributions} are collected in a list and only hashed in {@link #build()}. 45*f585d8a3SJacky Wang */ newSetBuilder(int estimatedSize)46*f585d8a3SJacky Wang public static <T> SetBuilder<T> newSetBuilder(int estimatedSize) { 47*f585d8a3SJacky Wang return new SetBuilder<T>(estimatedSize); 48*f585d8a3SJacky Wang } 49*f585d8a3SJacky Wang add(T t)50*f585d8a3SJacky Wang public SetBuilder<T> add(T t) { 51*f585d8a3SJacky Wang contributions.add(checkNotNull(t, SET_CONTRIBUTIONS_CANNOT_BE_NULL)); 52*f585d8a3SJacky Wang return this; 53*f585d8a3SJacky Wang } 54*f585d8a3SJacky Wang addAll(Collection<? extends T> collection)55*f585d8a3SJacky Wang public SetBuilder<T> addAll(Collection<? extends T> collection) { 56*f585d8a3SJacky Wang for (T item : collection) { 57*f585d8a3SJacky Wang checkNotNull(item, SET_CONTRIBUTIONS_CANNOT_BE_NULL); 58*f585d8a3SJacky Wang } 59*f585d8a3SJacky Wang contributions.addAll(collection); 60*f585d8a3SJacky Wang return this; 61*f585d8a3SJacky Wang } 62*f585d8a3SJacky Wang build()63*f585d8a3SJacky Wang public Set<T> build() { 64*f585d8a3SJacky Wang if (contributions.isEmpty()) { 65*f585d8a3SJacky Wang return Collections.emptySet(); 66*f585d8a3SJacky Wang } else if (contributions.size() == 1) { 67*f585d8a3SJacky Wang return Collections.singleton(contributions.get(0)); 68*f585d8a3SJacky Wang } else { 69*f585d8a3SJacky Wang return Collections.unmodifiableSet(new HashSet<>(contributions)); 70*f585d8a3SJacky Wang } 71*f585d8a3SJacky Wang } 72*f585d8a3SJacky Wang } 73