微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自动生成将通用类型装箱的构建器模式

如何解决自动生成将通用类型装箱的构建器模式

构建器实例化一个命令,该命令在设置值时将它们包装在未定义的对象中(然后仅在已设置newTitle的情况下,该方法才用于execute方法中以设置书名)。

命令类:

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或任何其他代码生成工具自动生成的样板代码,但是我找不到如何自动生成未定义的包装器。

两个工具都会生成

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

代替

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

是否可以更改由@Builder@Freebuilder注释生成代码模板,或者可以替代的任何其他工具?

解决方法

您可以使用Lombok的@Builder并自定义不符合您需求的零件。 Lombok会静默忽略builder类中已经存在的任何内容,其他所有内容将照常生成。

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

@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.
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。