首页 > 解决方案 > 自动生成包含泛型类型的构建器模式

问题描述

一个命令由一个 Builder 实例化,当设置值时,将它们包装在一个 Undefined 对象中(然后在执行方法中使用它来设置书名,前提是已经设置了 newTitle)。

命令类:

public class UpdateBookCommand {
  Book book;
  Undefined<String> newTitle;

  public Book execute(){
    if(newTitle.isDefined())
      this.book.setTitle(this.newTitle.get());
    return this.book;
  }

  public static class Builder {
    Book book;
    Undefined<String> newTitle = Undefined.instance();

    public Builder(Book book) {
      this.book=book;
    }

    public Builder newTitle(String newTitle){
      this.newTitle=Undefined.of(newTitle);
    }
    
    public UpdateBookCommand build() {
      UpdateBookCommand command = new UpdateBookCommand();
      command.newTitle=this.newTitle;
      return command;
    }
  }
}

这种模式效果很好,我打算将它用于我的所有命令,但需要大量样板代码,我想使用 Lombok@Builder或 FreeBuilder 或任何其他代码生成工具自动生成这些代码,但我找不到如何自动生成 Undefined包装。

两种工具都会生成

public Builder newTitle(Undefined<String> newTitle)){
  this.newTitle=newTitle;
}

代替

public Builder newTitle(String newTitle){
  this.newTitle=Undefined.of(newTitle);
}

有没有办法更改由@Builder@Freebuilder注释生成的代码模板,或者我可以使用的任何其他工具?

标签: javabuilderlombokfreebuilder

解决方案


您可以使用 Lombok's@Builder并自定义不符合您需求的部分。Lombok 会默默地忽略构建器类中已经存在的任何内容,而其他所有内容都将照常生成。

在您的示例中,如下所示:

@Builder
public class UpdateBookCommand {
  Book book;
  Undefined<String> newTitle;

  public static class UpdateBookCommandBuilder {
    public Builder newTitle(String newTitle) {
      this.newTitle=Undefined.of(newTitle);
    }
  }
  // Your methods here.
}

推荐阅读