Skip to content

Instantly share code, notes, and snippets.

@tiagofmcosta
Created February 23, 2018 00:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tiagofmcosta/e2b02b7ab4e5c8e3f50db7448c19e78d to your computer and use it in GitHub Desktop.
Save tiagofmcosta/e2b02b7ab4e5c8e3f50db7448c19e78d to your computer and use it in GitHub Desktop.
Implementation of the Builder pattern in Java without repeating code
package com.example.util;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Supplier;
@SuppressWarnings("unused")
public class GenericBuilder<T> {
private final Supplier<T> instantiator;
private final List<Consumer<T>> instanceModifiers = new ArrayList<>();
private GenericBuilder(final Supplier<T> instantiator) {
this.instantiator = instantiator;
}
public static <T> GenericBuilder<T> of(final Supplier<T> instantiator) {
return new GenericBuilder<>(instantiator);
}
public <U> GenericBuilder<T> with(final BiConsumer<T, U> consumer, final U value) {
final Consumer<T> c = instance -> consumer.accept(instance, value);
instanceModifiers.add(c);
return this;
}
public T build() {
final T value = instantiator.get();
instanceModifiers.forEach(modifier -> modifier.accept(value));
instanceModifiers.clear();
return value;
}
}
@tiagofmcosta
Copy link
Author

Originally found on Java Generic Builder Pattern.

Thank you Syed Sayem.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment