首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于Java 8 Lambda Builder模式的Lombok @Builder

基于Java 8 Lambda Builder模式的Lombok @Builder
EN

Stack Overflow用户
提问于 2018-06-30 05:02:45
回答 2查看 2.3K关注 0票数 1

我正在尝试使用这里引入的Java8Lambda构建器模式来使用Lombok。

波霍:

代码语言:javascript
运行
复制
@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);
    }
  }
}

用法:

代码语言:javascript
运行
复制
  @GetMapping(value = "/testLambdaBuilder", produces = MediaType.APPLICATION_JSON_VALUE)
  @ResponseBody
  public RestResponse<String> testEndpointLambdaBuilder() {
    return new RestResponseBuilder<String>().with($ -> $.data = "helloWorld").createRestResponse();
  }

Lombok似乎为构建器创建了一个包级构造函数。有办法把它变成公众吗?我得到的错误是:

构造函数RestResponse.RestResponseBuilder()不可见

EN

回答 2

Stack Overflow用户

发布于 2018-07-16 14:07:10

由于构建器类已经部分存在,Lombok将简单地将正确的字段注入您的RestResponseBuilder中。来自文献资料 (重点雷):

如果元素已经存在,每个列出的生成元素都将被悄悄跳过(忽略参数计数,只查看名称)。这包括构建器本身:(如果该类已经存在),lombok将简单地开始在这个已经存在的类内注入字段和方法,当然除非要注入的字段/方法已经存在。

因此,如果您希望这个字段在构建器类中具有公共可见性,那么只需要在那里声明它,Lombok就会尊重它:

代码语言:javascript
运行
复制
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方法似乎很奇怪。你可以这么做:

代码语言:javascript
运行
复制
return new RestResponse.RestResponseBuilder<String>().data("helloWorld").createRestResponse();
票数 0
EN

Stack Overflow用户

发布于 2018-10-22 11:29:11

结合Lombok使用lambda构建器模式有什么意义?

据我所知,每次向pojo / value对象添加新变量时,使用lambda构建器模式可以避免在构建器中添加setter方法(并正确地实现它)。

但是,如果您已经使用Lombok来生成您的构建器,那么所有构建器代码都已经生成了。因此,没有必要自己编写方法。每当您更改pojo时,Lombok也会更新构建器代码。

因此,我建议您要么使用Lombok,然后使用生成的默认构建器,要么自己编写构建器,然后使用lambda构建器模式来避免编写和维护太多的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51111889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档