4. Builder Supplier - aegisql/conveyor GitHub Wiki

BuilderSupplier

BuilderSupplier<T> defines how conveyors create builder instances for each build key.

Source: BuilderSupplier.java

Interface shape

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.

Basic usage

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.

BuilderLoader integration

conveyor.build()
       .id(1001)
       .supplier(UserBuilder::new)
       .create();

Advanced composition

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);

Recommendations

  • 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 BuilderSupplier decorators for conveyor-level defaults.
⚠️ **GitHub.com Fallback** ⚠️