专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员的那些事  ·  清华大学:DeepSeek + ... ·  昨天  
程序员的那些事  ·  OpenAI ... ·  12 小时前  
程序员小灰  ·  清华大学《DeepSeek学习手册》(全5册) ·  昨天  
程序员小灰  ·  3个令人惊艳的DeepSeek项目,诞生了! ·  22 小时前  
程序猿  ·  “未来 3 年内,Python 在 AI ... ·  3 天前  
51好读  ›  专栏  ›  SegmentFault思否

Lombok 使用详解,简化 Java 编程

SegmentFault思否  · 公众号  · 程序员  · 2019-11-30 10:00

正文

本文原载于 SegmentFault 社区
作者:日拱一兵




前言



在 Java 应用程序中存在许多重复相似的、生成之后几乎不对其做更改的代码,但是我们还不得不花费很多精力编写它们来满足 Java 的编译需求。

比如,在 Java 应用程序开发中,我们几乎要为所有 Bean 的成员变量添加 get() ,set() 等方法,这些相对固定但又不得不编写的代码浪费程序员很多精力,同时让类内容看着更杂乱,我们希望将有限的精力 关注在更重要的地方。


Lombok 已经诞生很久了,甚至在 Spring Boot Initalizr 中都已加入了 Lombok 选项。



这里我们将 Lombok 做一下详细说明:



Lombok



官网的介绍:Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again. Early access to future java features such as val, and much more.

直白的说:Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象 (POJO) 。它通过注解实现这一目的,且看:

Bean 的对比


传统的 POJO 类是这样的


通过 Lombok 改造后的 POJO 类是这样的


一眼可以观察出来我们在编写 Employee 这个类的时候通过 @Data 注解就已经实现了所有成员变量的 get() 与 set()方法等,同时 Employee 类看起来更加清晰简洁。Lombok 的神奇之处不止这些,丰富的注解满足了我们开发的多数需求。

Lombok 的安装


查看下图,@Data 的实现,我们发现这个注解是应用在编译阶段的


这和我们大多数使用的注解,如 Spring 的注解 (在运行时,通过反射来实现业务逻辑) 是有很大差别的,如 Spring 的 @RestController 注解


一个更直接的体现就是,普通的包在引用之后一般的 IDE 都能够自动识别语法,但是 Lombok 的这些注解,一般的 IDE 都无法自动识别,因此如果要使用 Lombok 的话还需要配合安装相应的插件来支持 IDE 的编译,防止 IDE 的自动检查报错,下面以 IntelliJ IDEA 举例安装插件。

在 Repositories 中搜索 Lombok,安装后重启 IDE 即可


在 Maven 或 Gradle 工程中添加依赖


至此我们就可以应用 Lombok 提供的注解干些事情了。




Lombok 注解详解



Lombok 官网提供了许多注解,但是 “劲酒虽好,可不要贪杯哦”,接下来逐一讲解官网推荐使用的注解 (有些注解和原有 Java 编写方式没太大差别的也没有在此处列举,如 @Synchronized 等)


@Getter和@Setter


该注解可应用在类或成员变量之上,和我们预想的一样,@Getter 和 @Setter 就是为成员变量自动生成 get 和 set 方法,默认生成访问权限为 public 方法,当然我们也可以指定访问权限 protected 等,如下图:


成员变量 name 指定生成 set 方法,并且访问权限为 protected;boolean 类型的成员变量 female 只生成 get 方法,并修改方法名称为 isFemale()。当把该注解应用在类上,默认为所有非静态成员变量生成 get 和 set 方法,也可以通过 AccessLevel.NONE 手动禁止生成 get 或 set 方法,如下图:


@ToString


该注解需应用在类上,为我们生成 Object 的 toString 方法,而该注解里面的几个属性能更加丰富我们想要的内容, exclude 属性禁止在 toString 方法中使用某字段,而 of 属性可以指定需要使用的字段,如下图:


查看编译后的 Employee.class 得到我们预期的结果,如下图


@EqualsAndHashCode


该注解需应用在类上,使用该注解,lombok 会为我们生成 equals(Object other) 和 hashcode() 方法,包括所有非静态属性和非 transient 的属性,同样该注解也可以通过 exclude 属性排除某些字段,of 属性指定某些字段,也可以通过 callSuper 属性在重写的方法中使用父类的字段,这样我们可以更灵活的定义 bean 的比对,如下图:


查看编译后的 Employee.class 文件,如下图:


@NonNull


该注解需应用在方法或构造器的参数上或属性上,用来判断参数的合法性,默认抛出 NullPointerException 异常


查看 NonNullExample.class 文件,会为我们抛出空指针异常,如下图:


当然我们可以通过指定异常类型抛出其他异常,lombok.nonNull.exceptionType = [NullPointerException | IllegalArgumentException] , 为实现此功能我们需要在项目的根目录新建 lombok.config 文件:


重新编译 NonNullExample 类,已经为我们抛出非法参数异常:


@NoArgsConstructor

@RequiredArgsConstructor

@AllArgsConstructor


以上三个注解分别为我们生成无参构造器,指定参数构造器和包含所有参数的构造器,默认情况下,@RequiredArgsConstructor, @AllArgsConstructor 生成的构造器会对所有标记 @NonNull 的属性做非空校验。

无参构造器很好理解,我们主要看看后两种,先看 @RequiredArgsConstructor

从上图中我们可以看出, @RequiredArgsConstructor 注解生成有参数构造器时只会包含有 final 和 @NonNull 标识的 field,同时我们可以指定 staticName 通过生成静态方法来构造对象。

查看 Employee.class 文件


当我们把 staticName 属性去掉我们来看遍以后的文件:


相信你已经注意到细节

@AllArgsConstructor 就更简单了,请大家自行查看吧


@Data


介绍了以上的注解,再来介绍 @Data 就非常容易懂了,@Data 注解应用在类上,是 @ToString, @EqualsAndHashCode, @Getter / @Setter 和 @RequiredArgsConstructor 合力的体现,如下图:


@Builder


函数式编程或者说流式的操作越来越流行,应用在大多数语言中,让程序更具更简介,可读性更高,编写更连贯,@Builder 就带来了这个功能,生成一系列的 builder API,该注解也需要应用在类上,看下面的例子就会更加清晰明了。


编译后的 Employee.class 文件如下:


妈妈再也不用担心我 set 值那么麻烦了,流式操作搞定:


@Log


该注解需要应用到类上,在编写服务层,需要添加一些日志,以便定位问题,我们通常会定义一个静态常量 Logger,然后应用到我们想日志的地方,现在一个注解就可以实现:


查看 class 文件,和我们预想的一样:



Log 有很多变种,CommonLog,Log4j,Log4j2,Slf4j 等,lombok 依旧良好的通过变种注解做良好的支持:


我实际使用的是 @Slf4j 注解






请到「今天看啥」查看全文