ParameterizedIdentifiableFactory.java
package com.github.dakusui.pcond.core.printable;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.function.Supplier;
public interface ParameterizedIdentifiableFactory<T> {
T create(Object... args);
abstract class Builder<T, B extends Builder<T, B>> {
Function<List<Object>, Supplier<String>> formatterFactory;
Function<List<Object>, T> factory;
public B name(String name) {
return this.formatterFactory((List<Object> args) -> () -> String.format("%s%s", name, args));
}
public ParameterizedIdentifiableFactory<T> factory(Function<List<Object>, T> predicateFactory) {
this.factory = Objects.requireNonNull(predicateFactory);
return this.build();
}
@SuppressWarnings("unchecked")
public B formatterFactory(Function<List<Object>, Supplier<String>> formatterFactory) {
this.formatterFactory = Objects.requireNonNull(formatterFactory);
return (B) this;
}
final public ParameterizedIdentifiableFactory<T> build() {
Objects.requireNonNull(this.factory);
return buildProtected();
}
public abstract ParameterizedIdentifiableFactory<T> buildProtected();
}
}