背景
在使用Lombok构建无参构造器的时候,同事同时使用了@Data和@Builder,造成了编译不通过的问题!
@Data使用说明
Lombok的@Data注解可以为我们生成无参构造方法和类中所有属性的Getter和Setter方法。这样在我们开发的过程中,我们就可以省却了不少Getter和Setter方法的。但是我们需要在代码中引入Lombok依赖以及Lombok插件)
@Data
public class LeaveWordReq {
/**
* 主键
*/
@NotBlank(message = "留言title必填",groups = {ValidGroup.Update.class})
private String id;
/**
* 留言title
*/
@NotBlank(message = "留言title必填",groups = {ValidGroup.Insert.class})
@Length(min=1, max=25,message = "留言title应该在1-25字符之间",groups = {ValidGroup.Insert.class})
private String title;
/**
}
从这段代码,我们可以看出我们没有任何的Getter/Setter方法。但是在编译完成后,这个类是有完整的Getter/Setter方法以及无参构造器的!不仅如此,就连HashCode、toString方法也都重写了!
如下图:
@Builder使用说明
@Builder使用后会给我们生成无参构造方法,但是无法生成Getter/Setter方法。
那么Builder在内部做了什么呢?
- 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)
- 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性
- 在构建器中:创建一个无参的 default 构造函数
- 在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)
- 在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象
- 在构建器中:会生成一个 toString 方法
- 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器
单独是用都是正确的,而且是有用的!但是一起使用的时候就会出现,生成Getter和Setter方法,无参构造函数就没有了!这显然是错误的!那怎么解决呢?
解决方案
直接使用无参构造器+有参构造器的方式
@RequiredArgsConstructor 来构建有参,
@NoArgsConstructor来构建无参构造器
好了,今天关于Lombok的@Data和@Builder先说到这,欢迎大家留言交流!
也希望大家关注我的公号《coder练习生》