我正在尝试使用这里引入的Java8Lambda构建器模式来使用Lombok。
波霍:
@JsonInclude(Include.NON_NULL)
@Builder
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class RestResponse<T> {
@Getter @Setter @Builder.Default private Boolean success = true;
@Getter @Setter @NonNull private T data;
public static class RestResponseBuilder<T> {
public RestResponseBuilder<T> with(Consumer<RestResponseBuilder<T>> builderFunction) {
builderFunction.accept(this);
return this;
}
public RestResponse<T> createRestResponse() {
return new RestResponse<T>(success, data);
}
}
}
用法:
@GetMapping(value = "/testLambdaBuilder", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public RestResponse<String> testEndpointLambdaBuilder() {
return new RestResponseBuilder<String>().with($ -> $.data = "helloWorld").createRestResponse();
}
Lombok似乎为构建器创建了一个包级构造函数。有办法把它变成公众吗?我得到的错误是:
构造函数RestResponse.RestResponseBuilder()不可见
发布于 2018-07-16 14:07:10
由于构建器类已经部分存在,Lombok将简单地将正确的字段注入您的RestResponseBuilder
中。来自文献资料 (重点雷):
如果元素已经存在,每个列出的生成元素都将被悄悄跳过(忽略参数计数,只查看名称)。这包括构建器本身:(如果该类已经存在),lombok将简单地开始在这个已经存在的类内注入字段和方法,当然除非要注入的字段/方法已经存在。
因此,如果您希望这个字段在构建器类中具有公共可见性,那么只需要在那里声明它,Lombok就会尊重它:
public static class RestResponseBuilder<T> {
public T data;
public RestResponseBuilder<T> with(Consumer<RestResponseBuilder<T>> builderFunction) {
builderFunction.accept(this);
return this;
}
public RestResponse<T> createRestResponse() {
return new RestResponse<T>(success, data);
}
}
所有这些都表明,您的with
方法似乎很奇怪。你可以这么做:
return new RestResponse.RestResponseBuilder<String>().data("helloWorld").createRestResponse();
发布于 2018-10-22 11:29:11
结合Lombok使用lambda构建器模式有什么意义?
据我所知,每次向pojo / value对象添加新变量时,使用lambda构建器模式可以避免在构建器中添加setter方法(并正确地实现它)。
但是,如果您已经使用Lombok来生成您的构建器,那么所有构建器代码都已经生成了。因此,没有必要自己编写方法。每当您更改pojo时,Lombok也会更新构建器代码。
因此,我建议您要么使用Lombok,然后使用生成的默认构建器,要么自己编写构建器,然后使用lambda构建器模式来避免编写和维护太多的方法。
https://stackoverflow.com/questions/51111889
复制相似问题