我想使用流畅的Api来减少方法的参数列表。我不想为此创建构造函数,所以我用Lombok- @ Builder:
来表示方法@Builder
public static void test(User user, Item item, int age, Map<String, Test> tests, LocalDateTime time, String desc){
..method related things..
}
现在,我希望用@Builder的Fluent-Api调用该方法:
test.withUser(u).withItem(i)...build();
但是,由于我没有任何吸气剂和固定器,因此该方法不存在流畅的Api。这是@Builder在方法上的正确用法吗?
答案 0 :(得分:4)
这是您使用默认Builder语法的方式。
@Builder
public static void test(User user, Item item){
// ...
}
public void buildTestExample(){
builder()
.user(new User())
.item(new Item())
.build();
}
但是,您可以像这样指定方法名称:
@Builder(builderMethodName = "buildTest")
public static void test(User bar, Item item){
// ...
}
public void buildTestExample(){
buildTest()
.user(new User())
.item(new Item())
.build();
}
请参阅https://projectlombok.org/features/Builder
使用@Builder注释的方法(从现在开始称为目标) 导致生成以下7件事:
- 一个名为FooBuilder的内部静态类,具有相同的类型参数 作为静态方法(称为构建器)。
- 在构建器中:目标的每个参数的一个私有非静态非最终字段。
- 在构建器中:一个包私有no-args空构造函数。
- 在构建器中:对于目标的每个参数,类似“setter”的方法:它与该参数的类型相同,同名。它返回构建器 本身,以便可以链接setter调用,如上所述 示例
- 在构建器中:调用方法的build()方法, 在每个领域传球。它返回与目标相同的类型 回报。
- 在构建器中:一个合理的toString()实现。
- 在包含目标的类中:一个builder()方法,它创建一个新的 建造者的实例。
这是一个任意示例,显示您可以为2个方法使用2个构建器,并且它可以正常工作。
@Builder(builderMethodName = "buildFoo")
public static String foo(String param1, String param2){
return "foo" + param1 + param2;
}
@Builder(builderMethodName = "buildBar")
public static String bar(String param1, String param2){
return "bar" + param1 + param2;
}
@Test
public void test(){
assertThat(buildFoo().param1("h").param2("w").build()).isEqualTo("foohw");
assertThat(buildBar().param1("h").param2("w").build()).isEqualTo("foohw");
}