java - 如何使用泛型而不是注释来实现构建器类?

标签 java generics wrapper factory-pattern

我想编写一个通用的 builder 类,它环绕任何 java 类并提供特定样式的 setter 函数。我不确定这是否可以称为“动态生成的函数”。

当我有一个 beanish Pojo 类时,即

class Pojo {
    public void setValue(int value) {...}
    public void setName(String name) {...}
}

我的 Maker 类应该像这样使用:

Pojo p = Builder<Pojo>.create(new Pojo())
             .setName("Funny")
             .setValue(123)
             .build();

如你所见,它所做的工作应该类似于

class PojoBuilder {
    private Pojo pojo;
    PojoBuilder(Pojo pojo) { this.pojo = pojo; }
    public static PojoMaker create(Pojo p) { return new PojoBuilder(p); }
    public PojoBuilder setName(String name) { pojo.setName(name); return this; }
    public PojoBuilder setValue(int val) { pojo.setValue(val); return this; }
    public Pojo make() { return pojo; }
}

只是,我希望 Maker 是通用的。显然,“setXyz”-方法取决于通用参数。如何做到这一点?

当然,功能相同但句法不同的方法也可以。

我想在没有注释的情况下执行此操作:使用我收集的注释,我需要对我的源代码进行第二次 javac 传递,以生成包装代码。这似乎是 Limbok 所做的或某些 JPA 包装器 的工作方式。但是当我使用 Mockito 时,似乎没有必要进行此传递。那么,如何使用泛型做到这一点?

最佳答案

最简单的方法是使用 Lombok 库。

@Value
@Builder
public class MessageEvent<T> {
    T message;
    TypeEnum type;
}

用法是这样的。

MessageEvent<String> messageEvent = MessageEvent.<String>builder().message("test").build();

关于java - 如何使用泛型而不是注释来实现构建器类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24936150/

相关文章:

Java 使用 Graphics2d 进行旋转和绘图

Java Mission Control – 飞行记录器抛出解析器异常

java - 如何动态填充 Eclipse 弹出菜单?

java - 涉及通配符的赋值的实际应用是什么?

c - 将 var 分配给 var - 它会起作用吗?

Angular Material Tabs 不适用于包装器组件

java - 对可比较接口(interface)的数组进行排序

c# - 无法传递派生列表<>

c# - C#.NET 中 liskov 原则的类型参数约束

java - Java 中的原始包装类是否被视为引用类型?