package de.plushnikov.builder.generic.util.collection; import lombok.Singular; import java.util.ArrayList; import java.util.Collection; public class SingularCollection<T> { @Singular private Collection rawTypes; @Singular private Collection<Integer> integers; @Singular private Collection<T> generics; @Singular private Collection<? extends Number> extendsGenerics; @java.beans.ConstructorProperties({"rawTypes", "integers", "generics", "extendsGenerics"}) SingularCollection(Collection rawTypes, Collection<Integer> integers, Collection<T> generics, Collection<? extends Number> extendsGenerics) { this.rawTypes = rawTypes; this.integers = integers; this.generics = generics; this.extendsGenerics = extendsGenerics; } public static void main(String[] args) { //SingularCollection.<Float>builder().generic(20.0f).integer(10).extendsGeneric(2).rawType(2.0); } public static <T> SingularCollectionBuilder<T> builder() { return new SingularCollectionBuilder<T>(); } public static class SingularCollectionBuilder<T> { private ArrayList<Object> rawTypes; private ArrayList<Integer> integers; private ArrayList<T> generics; private ArrayList<Number> extendsGenerics; SingularCollectionBuilder() { } public SingularCollection.SingularCollectionBuilder<T> rawType(Object rawType) { if (this.rawTypes == null) this.rawTypes = new ArrayList<Object>(); this.rawTypes.add(rawType); return this; } public SingularCollection.SingularCollectionBuilder<T> rawTypes(Collection<?> rawTypes) { if (this.rawTypes == null) this.rawTypes = new ArrayList<Object>(); this.rawTypes.addAll(rawTypes); return this; } public SingularCollection.SingularCollectionBuilder<T> clearRawTypes() { if (this.rawTypes != null) this.rawTypes.clear(); return this; } public SingularCollection.SingularCollectionBuilder<T> integer(Integer integer) { if (this.integers == null) this.integers = new ArrayList<Integer>(); this.integers.add(integer); return this; } public SingularCollection.SingularCollectionBuilder<T> integers(Collection<? extends Integer> integers) { if (this.integers == null) this.integers = new ArrayList<Integer>(); this.integers.addAll(integers); return this; } public SingularCollection.SingularCollectionBuilder<T> clearIntegers() { if (this.integers != null) this.integers.clear(); return this; } public SingularCollection.SingularCollectionBuilder<T> generic(T generic) { if (this.generics == null) this.generics = new ArrayList<T>(); this.generics.add(generic); return this; } public SingularCollection.SingularCollectionBuilder<T> generics(Collection<? extends T> generics) { if (this.generics == null) this.generics = new ArrayList<T>(); this.generics.addAll(generics); return this; } public SingularCollection.SingularCollectionBuilder<T> clearGenerics() { if (this.generics != null) this.generics.clear(); return this; } public SingularCollection.SingularCollectionBuilder<T> extendsGeneric(Number extendsGeneric) { if (this.extendsGenerics == null) this.extendsGenerics = new ArrayList<Number>(); this.extendsGenerics.add(extendsGeneric); return this; } public SingularCollection.SingularCollectionBuilder<T> extendsGenerics(Collection<? extends Number> extendsGenerics) { if (this.extendsGenerics == null) this.extendsGenerics = new ArrayList<Number>(); this.extendsGenerics.addAll(extendsGenerics); return this; } public SingularCollection.SingularCollectionBuilder<T> clearExtendsGenerics() { if (this.extendsGenerics != null) this.extendsGenerics.clear(); return this; } public SingularCollection<T> build() { Collection<Object> rawTypes; switch (this.rawTypes == null ? 0 : this.rawTypes.size()) { case 0: rawTypes = java.util.Collections.emptyList(); break; case 1: rawTypes = java.util.Collections.singletonList(this.rawTypes.get(0)); break; default: rawTypes = java.util.Collections.unmodifiableList(new ArrayList<Object>(this.rawTypes)); } Collection<Integer> integers; switch (this.integers == null ? 0 : this.integers.size()) { case 0: integers = java.util.Collections.emptyList(); break; case 1: integers = java.util.Collections.singletonList(this.integers.get(0)); break; default: integers = java.util.Collections.unmodifiableList(new ArrayList<Integer>(this.integers)); } Collection<T> generics; switch (this.generics == null ? 0 : this.generics.size()) { case 0: generics = java.util.Collections.emptyList(); break; case 1: generics = java.util.Collections.singletonList(this.generics.get(0)); break; default: generics = java.util.Collections.unmodifiableList(new ArrayList<T>(this.generics)); } Collection<Number> extendsGenerics; switch (this.extendsGenerics == null ? 0 : this.extendsGenerics.size()) { case 0: extendsGenerics = java.util.Collections.emptyList(); break; case 1: extendsGenerics = java.util.Collections.singletonList(this.extendsGenerics.get(0)); break; default: extendsGenerics = java.util.Collections.unmodifiableList(new ArrayList<Number>(this.extendsGenerics)); } return new SingularCollection<T>(rawTypes, integers, generics, extendsGenerics); } public String toString() { return "de.plushnikov.builder.generic.util.collection.SingularCollection.SingularCollectionBuilder(rawTypes=" + this.rawTypes + ", integers=" + this.integers + ", generics=" + this.generics + ", extendsGenerics=" + this.extendsGenerics + ")"; } } }