4. Builder Supplier - aegisql/conveyor GitHub Wiki
BuilderSupplier<T> defines how conveyors create builder instances for each build key.
Source: BuilderSupplier.java
public interface BuilderSupplier<T>
extends Supplier<Supplier<? extends T>>, Serializable {
static <T> BuilderSupplier<T> of(BuilderSupplier<T> instance)
static <T> BuilderSupplier<T> of(Supplier<? extends T> instance)
default BuilderSupplier<T> expire(...)
default BuilderSupplier<T> readyAlgorithm(...)
default BuilderSupplier<T> onTimeout(...)
default BuilderSupplier<T> withFuture(CompletableFuture<T> future)
}The outer supplier creates a new builder supplier context; the inner supplier returns the actual builder instance used by the conveyor.
Given a builder type:
public class UserBuilder implements Supplier<User> {
// setters/consumers omitted
@Override
public User get() {
return new User(...);
}
}Configure conveyor:
Conveyor<Integer, String, User> conveyor = new AssemblingConveyor<>();
conveyor.setBuilderSupplier(BuilderSupplier.of(UserBuilder::new));You can also pass UserBuilder::new directly where BuilderSupplier<OUT> is expected.
conveyor.build()
.id(1001)
.supplier(UserBuilder::new)
.create();BuilderSupplier supports per-build behavioral decorators:
-
expire(...)- attach expiration policy. -
readyAlgorithm(...)- attach readiness predicate/bi-predicate. -
onTimeout(...)- attach timeout handler. -
withFuture(...)- attach external product future.
Example:
CompletableFuture<User> out = new CompletableFuture<>();
BuilderSupplier<User> supplier = BuilderSupplier.of(UserBuilder::new)
.expire(30, TimeUnit.SECONDS)
.onTimeout(builder -> {
// custom timeout handling
})
.withFuture(out);
conveyor.setBuilderSupplier(supplier);- Keep builders lightweight and stateless at constructor time.
- Do not share mutable builder instances between keys.
- Use loader-level timing (
ttl,expirationTime) for request-specific overrides. - Use
BuilderSupplierdecorators for conveyor-level defaults.