前言
在 Java 应用程序中存在许多重复类似的、生成以后几乎不对其作更改的代码,可是咱们还不得不花费不少精力编写它们来知足 Java 的编译需求java
好比,在 Java 应用程序开发中,咱们几乎要为全部 Bean 的成员变量添加 get() ,set() 等方法,这些相对固定但又不得不编写的代码浪费程序员不少精力,同时让类内容看着更杂乱,咱们但愿将有限的精力关注在更重要的地方。程序员
Lombok 已经诞生好久了,甚至在 Spring Boot Initalizr 中都已加入了 Lombok 选项,编程
这里咱们将 Lombok 作一下详细说明:api
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.ide
直白的说: Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤为是对于简单的 Java 对象(POJO)。它经过注解实现这一目的,且看:函数式编程
Bean 的对比
传统的 POJO 类是这样的函数
经过Lombok改造后的 POJO 类是这样的工具
一眼能够观察出来咱们在编写 Employee 这个类的时候经过 @Data 注解就已经实现了全部成员变量的 get() 与 set()方法等,同时 Employee 类看起来更加清晰简洁。Lombok 的神奇之处不止这些,丰富的注解知足了咱们开发的多数需求。性能
Lombok的安装br/>查看下图,@Data的实现,咱们发现这个注解是应用在编译阶段的ui
这和咱们大多数使用的注解,如 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 注解
val
熟悉 Javascript 的同窗都知道,var 能够定义任何类型的变量,而在 java 的实现中咱们须要指定具体变量的类型,而 val 让咱们摆脱指定,编译以后就精准匹配上类型,默认是 final 类型,就像 java8 的函数式表达式,()->System.out.println(“hello lombok”); 就能够解析到Runnable函数式接口。
查看解析后的class文件:
@Cleanup
当咱们对流进行操做,咱们一般须要调用 close 方法来关闭或结束某资源,而 @Cleanup 注解能够帮助咱们调用 close 方法,而且放到 try/finally 处理块中,以下图:
编译后的class文件以下,咱们发现被try/finally包围处理,并调用了流的close方法
其实在 JDK1.7 以后就有了 try-with-resource,不用咱们显式的关闭流,这个请你们自行看吧
总结
Lombok 固然还有不少注解,我推荐使用以上就足够了,这个工具是带来便利的,而不能被其捆绑,“弱水三千只取一瓢饮,代码千万需抓重点看”,Lombok 能让我更加专一有效代码排除意义微小的障眼代码(get,set等),另外Lombok生成的代码还能像使用工具类同样方便(@Builder)。
更多内容请查看官网:https://www.projectlombok.org/
灵魂追问
tan日拱一兵转发在看也很赞喜欢做者