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