java - 具有泛型的构建器

标签 java oop generics design-patterns builder

我有以下层次结构

名为的双泛型类

public class Service<T, U> 
{
    private final Supplier<T>
    private final Function<T, U>
    private final Consumer<U>
    // more fields and methods ...
}

该类的构建器 ServiceBuilder<T, U>使用通常的流畅 API 构建器

public class ServiceBuilder<T, U>
{
    private Supplier<T> supplier;
    private Function<T, U> mapper;
    private Consumer<U> consumer;
    // more fields and methods ....

    public ServiceBuilder<T, U> withSupplier(Supplier<T> supplier)
    {
        this.supplier = supplier;
        return this;
    }

    // more fields and methods ....

    public Service<T, U> build()
    {
        return new Service(supplier, mapper, consumer);
    }
}

基于此,我想提供一个易于使用的T的Supplier,比如说DummySupplier

public class DummySupplier implements Supplier<SomeObject>
{
    public SomeObject get()
    {
        return new SomeObject();
    }
}

我想要一个ServiceBuilder<SomeObject, T>利用该供应商,有效地修复 T这样我只需要一个Function<SomeObject, U> mapper和一个 Consumer<U> consumer>构建我的服务。

我该如何处理这个问题?扩展ServiceBuilder不起作用,因为我想重用的所有现有方法都返回 ServiceBuilder而不是某个类扩展 ServiceBuilder ...

是否有一些已知的模式可供采用?

最佳答案

都不是Function<SomeObject, U> mapper也不SomeObject知道DummySupplier 。 此信息必须放置在某个位置,例如 SpecializedServiceBuilder :

public class SpecializedServiceBuilder<U> extends ServiceBuilder<SomeObject, U> {

    ServiceBuilder withSomeObjectFunction(Function<SomeObject, U> mapper) {
        this.supplier = new DummySupplier();
        this.mapper = mapper;
        return this;
    }
}

关于java - 具有泛型的构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58915679/

相关文章:

c# - 使用 Dapper QueryMultiple 时在泛型参数中提供类型

java - 构造函数中带有参数的泛型并调用 T 方法

java - 重置 BufferedInputStream 持有 FileInputStream

java - 根据日期对 HashMap 进行排序,如何将其重建回来?

php - 什么时候应该使用 stdClass,什么时候应该在 php oo 代码中使用数组?

c# - 同名的静态方法和实例方法?

java - 具有接口(interface)返回类型的通用方法

JavaFX:在 TableView 的开头添加行

java - 如何遍历对象列表并分配 child ?

带有原型(prototype)的 Javascript 继承