千万别乱用!Lombok不是万能的

文章讨论了在使用Lombok的@Data和@Builder注解时遇到的编译问题。@Data自动为类生成无参构造器、Getter/Setter等,而@Builder则用于构建对象,两者一起使用可能导致构造器冲突。解决方案是改用@RequiredArgsConstructor和@NoArgsConstructor来分别定义有参和无参构造器。

背景

在使用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在内部做了什么呢?

  1. 创建一个名为 ThisClassBuilder 的内部静态类,并具有和实体类相同的属性(称为构建器)
  2. 在构建器中:对于目标类中的所有的属性和未初始化的 final 字段,都会在构建器中创建对应属性
  3. 在构建器中:创建一个无参的 default 构造函数
  4. 在构建器中:实体类中的每个参数,都会对应创建类似于 setter 的方法,方法名与该参数名相同。 并且返回值是构建器本身(便于链式调用)
  5. 在构建器中:会创建一个 build 方法,调用 build 方法,就会根据设置的值进行创建实体对象
  6. 在构建器中:会生成一个 toString 方法
  7. 在实体类中:会创建一个 builder 方法,它的目的是用来创建构建器

单独是用都是正确的,而且是有用的!但是一起使用的时候就会出现,生成Getter和Setter方法,无参构造函数就没有了!这显然是错误的!那怎么解决呢?

解决方案

直接使用无参构造器+有参构造器的方式

@RequiredArgsConstructor 来构建有参,

@NoArgsConstructor来构建无参构造器

好了,今天关于Lombok的@Data和@Builder先说到这,欢迎大家留言交流!

也希望大家关注我的公号《coder练习生》

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ybb_ymm

你的鼓励会是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值