我在我的项目中有很多值对象。
我正在使用Project Lombok来消除一些模板代码,因此我的值对象看起来像以下这个:
@Value
@Accessors(fluent = true)
public class ValueObject {
private final String firstProp;
private final int secondProp;
}
还不错,几乎没有样板代码。
现在,在我的测试中经常使用全参构造函数。这看起来有点杂乱,所以我想介绍建造者模式的变体:
public class ValueObjectBuilder {
private static final int DEFAULT_VALUE_FOR_SECOND_PROP = 666;
private String firstProp = "default value for first prop;
private int secondProp = DEFAULT_VALUE_FOR_SECOND_PROP;
private ValueObjectBuilder() {}
public static ValueObjectBuilder newValueObject() {
return new ValueObjectBuilder();
}
public ValueObjectBuilder withFirstProp(String firstProp) {
this.firstProp = firstProp
return this;
}
public ValueObjectBuilder withFirstProp(int secondProp) {
this.secondProp = secondProp;
return this;
}
public ValueObject build() {
return new ValueObject(
firstProp, secondProp
);
}
}
现在代码看起来非常不错:
ValueObjectBuilder
.newValueObject()
.withFirstProp("prop")
.withSecondProp(15)
.build();
现在的问题是 - 正如我所提到的,我必须写很多类似的类... 我已经厌倦了复制粘贴它们。
我正在寻找的是一种黑魔法智能工具,它将以某种方式为我生成这段代码。
我知道,在Lombok中有一个@Builder注释,但它不符合我的要求。原因如下:
1) 我无法在lombok的Builder中提供默认值。好吧,实际上,这是可能的 - 通过自己实现builder类模板
@Builder
public class Foo {
private String prop;
public static class FooBuilder() {
private String prop = "def value";
...
}
}
1)它还生成了一些样板代码。
2)我找不到任何方法在lombok的构建器中为每个字段访问器添加前缀。也许@Wither可以帮助这里?但是我不知道如何正确使用它。
3)最重要的原因:我并没有创建一个“自然”的构建器。据我所知,lombok旨在为给定的注释类创建构建器-我不知道是否有一种方法可以从build()
方法中返回任何其他对象。
那么,总结一下:您知道任何可能帮助我的工具吗?或者也许所有我提到的事情实际上都可以使用Lombok实现?
编辑
好的,所以我可能找到了一个解决这个特殊情况的解决方案。使用lombok,我们可以使用:
@Setter
@Accessors(chain = true, fluent = true)
@NoArgsConstructor(staticName = "newValueObject")
public class ValueObjectBuilder {
private String firstProp = "default";
private int secondProp = 666;
public ValueObject build() {
return new ValueObject(firstProp, secondProp);
}
}
您好,Slawek先生:
FooBuilder 不是公共的,无法从包外访问
。 - nKognito