Lombok 子类中如何使用@Builder

Posted by Yezhiwei on October 23, 2018

Lombok神器

转载文章 https://blog.csdn.net/lqadam/article/details/82719841

Lombok 大家都知道,在使用 POJO 过程中,它给我们带来了很多便利,省下大量写 get、set 方法、构造器、equal、toString 方法的时间。除此之外,通过 @Builder 注解,Lombok 还可以方便的时间建造者模式。

但是,在使用 @Builder 过程中,我发现了一问题:子类的 Builder 对象没有父类的属性。这在使用上造成了一定的问题。

几番搜索,对于这个问题,找到了如下解法,解法的链接会放到文末。

  1. 对于父类,使用 @AllArgsConstructor 注解
  2. 对于子类,手动编写全参数构造器,内部调用父类全参数构造器,在子类全参数构造器上使用 @Builder 注解

通过这种方式,子类 Builder 对象可以使用父类的所有私有属性。

但是这种解法也有两个副作用:

  1. 因为使用 @AllArgsConstructor 注解,父类构造函数字段的顺序由声明字段的顺序决定,如果子类构造函数传参的时候顺序不一致,字段类型还一样的话,出了错不好发现
  2. 如果父类字段有增减,所有子类的构造器都要修改

虽然有这两个副作用,但是这种解法是我找到的唯一一种解决子类使用 @Builder,能使用父类属性的方式。

参考博客:

Lombok’s @Builder annotation and inheritance

副作用见博客评论

另,这个博主对 Lombok 使用很有心得,我闲看还看到他另一篇涉及到 @Builder 的文章,将如何在使用 @Builder 的模式中,加入字段的默认值。因为使用了建造者模式,那么一般在类内声明字段的时候给字段默认值的方式就是无效的,需要在建造者上动手脚。方式是:

  1. 自定义静态内部类作为建造者,赋予默认值,再使用 @Builder 注解,这个时候 Lombok 会补全已有的建造者类,进而使用默认值
  2. 更新的 Lombok 有 @Builder.Default 声明,注解在需要默认值的字段上即可。

在评论区也有这种方式的副作用讨论,可以一看。链接是:

Using Lombok’s @Builder annotation with default values

更多的注解请看官方文档