Lombok使用手册

一、序言

对于 Lombok 的使用是有争议的,作者对 Lombok 的态度是强烈推荐,甚至认为应当将部分常用功能直接以 JDK 的形式集成。

在构建实体类过程中写一堆Set/Get方法毫无意义;默认继承Object类的toString方法官方建议重写,每个实体类为了表达具象的实体信息而重写toString方法,操作繁琐。

二、常用注解解析

(一)实体类注解

下面讨论的注解是添加到实体类上面的。

public class XUser {
    private Integer userId;
    private String userName;
}

1、@Data

添加@Data注解后,编译后的实体类自动增加如下信息:属性的Set/Get方法,变化后自动增减;默认构造器,其中equals方法、hashCode方法、toString方法由 Lombok 重写。后面会详细讨论其重写逻辑。

 

2、@AllArgsConstructor

添加@AllArgsConstructor注解后,编译后的实体自动增加如下信息:全参构造器。添加完@AllArgsConstructor注解后,一般都需要无参构造器的注解@NoArgsConstructor

 

在添加完@AllArgsConstructor注解后,增加@NoArgsConstructor后实体类变化如下:

 

3、@ToString

添加@ToString注解后,编译后的实体自动增加如下信息:重写的toString方法。

 

@ToString注解在@Data注解存在的情况下是不需要额外添加的,除非是需要用到其属性配置。常用的属性配置为callSuper = true表示将父类的属性值一起添加至重写的toString方法中。

4、@Builder

添加@Builder注解后,编译后的实体自动增加如下信息:链式Set方法。

 

链式 Set 方法的优点如下:

// 用简洁的方式实例化实体类并完成赋值操作
XUser xUser = XUser.builder().userId(1).userName("AAAAA").build();

5、@Accessors

添加@Accessors(chain = true)注解后,编译后的实体类变化如下:setXxx方法是有返回值的,并且是当前对象的示例。使用此注解需要注意三点:

  • 此注解属于试验型的,可能后期会删除;
  • 此注解将属性chain设置为true是效果生效的必要条件之一;
  • 配合@Data注解或者@Setter注解使用是效果生效的必要条件。
@Setter
@Accessors(chain = true)
public class XUser {
    private Integer userId;
    private String userName;
}

 

主要参数介绍

参数

默认值

注释

fluent

false

控制生成的 getter setter 方法前面是否带 get/set。如果为true,则chain自动开启,无需再次设置

chain

chain

如果设置为truesetter 返回的是此对象,方便链式调用方法

参数fluent应谨慎使用,对于 Jackson 序列化框架,不带 get/set 前缀的方法有不识别的概率。

(二)服务类注解

上面提到的是针对实体类常用的注解,此处主要讲服务类注解。两者并没有明显的界限区分,理论上都能使用,本处仅仅是根据使用场合进行区分。

1、@Log4j2

类添加完@Log4j2注解后,当前类实例自动持有log成员变量,可以通过此变量增加日志信息。

@Log4j2
public class XUserServiceImpl {
    public void saveUser(XUser user) {
        log.info("此方法保存用户信息");
    }
}

类信息变化如下:

 

三、过程探究

(一)重写

Lombok 中的部分注解会重写下列方法:equals方法、hashCode方法、toString

1、toString 方法

1)默认实现

默认继承超类Object的实现

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

示例

XUser xUser = new XUser();
System.out.println(xUser.toString());
System.out.println(xUser.toString());

同一个实例的输出结果一致

xin.altitude.lombok.domain.XUser@43d7741f
xin.altitude.lombok.domain.XUser@43d7741f

2)重写实现

示例

System.out.println(new XUser(1,"AAAAA").toString());
System.out.println(new XUser(1,"AAAAA").toString());~

相同的成员变量输出值一致,只有当成员变量不同时,输出结果才有差异,与执行次数无关,与实例对象引用无关。

XUser(userId=1, userName=AAAAA)
XUser(userId=1, userName=AAAAA)

2、equals 方法

1)默认实现

默认继承超类Object的实现

public boolean equals(Object obj) {
    return (this == obj);
}

示例

XUser xUser1 = new XUser(1, "AAAAA");
XUser xUser2 = xUser1;
// 在同一个JVM中,相同的引用对象实例相同(输出为true
boolean bl = xUser1.equals(xUser2);

2)重写实现

示例

// 对象的属性值是否相等(输出是true
boolean bl = new XUser(1, "AAAAA").equals(new XUser(1, "AAAAA"));

相同的成员变量构造出对象使用重写后的equals方法,无论执行多少次,结果都为true

看完如果有帮助,希望可以给个 三连 ,你的鼓励就是我不断前进的动力。谢谢
关注我:私信获取Java高级架构资料、大厂面试试题、视频

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值