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, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
Lombok 是一种 Java 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO)。它通过注释实现这一目的。通过在开发环境中实现 Lombok,开发人员可以节省构建诸如 hashCode() 和 equals() 这样的方法以及以往用来分类各种 accessor 和 mutator 的大量时间。
安装
IDEA 安装 Lombok 插件
1、Setting → Plugin,搜索 Lombok 安装即可
IDEA 2020.3 版本开始已经内置 Lombok 插件,
2、导入 Lombok 依赖
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version><scope>provided</scope></dependency>
Eclipse 安装 Lombok 插件
1、官网下载 jar 包:https://projectlombok.org/download
2、双击 lombak.jar 包
3、点击 Install / Update
4、点击Quit Installer,完成安装
5、安装完成之后,确认 eclipse 安装路径下是否多了一个 lombok.jar 包,并且配置文件 eclipse.ini 中是否添加了如下内容:
-javaagent:D:\eclipse-jee-2021-03-R-win32-x86_64\eclipse\lombok.jar
Lombok 常用注解说明
@NonNull
@Cleanup
@Getter and @Setter
@AllArgsConstructo
@RequiredArgsConstructor
@NoArgsConstructor
@ToString
@EqualsAndHashCode
@Data
@NonNull
用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常
importlombok.NonNull; publicclassNonNullExampleextendsSomething { privateStringname; publicNonNullExample(Personperson) { this.name=person.getName(); } }
相当于
importlombok.NonNull; publicclassNonNullExampleextendsSomething { privateStringname; publicNonNullExample(Personperson) { if (person==null) { thrownewNullPointerException("person is marked @NonNull but is null"); } this.name=person.getName(); } }
@Cleanup
用在变量前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的close()方法
importlombok.Cleanup; importjava.io.*; publicclassCleanupExample { publicstaticvoidmain(String[] args) throwsIOException { InputStreamin=newFileInputStream(args[0]); OutputStreamout=newFileOutputStream(args[1]); byte[] b=newbyte[10000]; while (true) { intr=in.read(b); if (r==-1) break; out.write(b, 0, r); } } }
相当于
importjava.io.*; publicclassCleanupExample { publicstaticvoidmain(String[] args) throwsIOException { InputStreamin=newFileInputStream(args[0]); try { OutputStreamout=newFileOutputStream(args[1]); try { byte[] b=newbyte[10000]; while (true) { intr=in.read(b); if (r==-1) break; out.write(b, 0, r); } } finally { if (out!=null) { out.close(); } } } finally { if (in!=null) { in.close(); } } } }
@Getter and @Setter
在成员变量前面,相当于为成员变量生成对应的 get 和 set 方法,还可以为生成的方法指定访问修饰符,默认为public
在类上,可以为此类里的所有非静态成员变量生成对应的 get 和 set 方法。
importlombok.AccessLevel; importlombok.Getter; importlombok.Setter; publicclassGetterSetterExample { privateintage; AccessLevel.PROTECTED) (privateStringname; }
相当于
publicclassGetterSetterExample { privateintage; privateStringname; publicintgetAge() { returnage; } publicvoidsetAge(intage) { this.age=age; } protectedvoidsetName(Stringname) { this.name=name; } }
@AllArgsConstructor / @NoArgsConstructor
在类上使用,为该类产生全参构造方法和无参构造方法
importlombok.AllArgsConstructor; importlombok.NoArgsConstructor; publicclassUser { privateintid; privateStringname; privateStringpassword; }
相当于
publicclassUser { privateintid; privateStringname; privateStringpassword; publicUser() { } publicUser(intid, Stringname, Stringpassword) { this.id=id; this.name=name; this.password=password; } }
@ToString
在类上使用,生成 toString() 方法
- @ToString.Exclude 排除指定字段
- @ToString.Include 包含指定字段
importlombok.ToString; publicclassUser { Exclude .privateintid; privateStringname; }
相当于
publicclassUser { privateintid; privateStringname; publicUser() { } publicStringtoString() { return"User(name="+this.name+")"; } }
@EqualsAndHashCode
生成 equals() 和 hashCode() 方法,以及 canEqual() 方法用来判断某个对象是否是当前类的实例,生成方法时只会使用类中的 非静态 和 非transient 成员变量
- @EqualsAndHashCode.Exclude 排除指定字段
- @EqualsAndHashCode.Include 包含指定字段
importlombok.EqualsAndHashCode; publicclassUser { privateintid; privateStringname; }
相当于
publicclassUser { privateintid; privateStringname; publicUser() { } publicbooleanequals(Objecto) { if (o==this) { returntrue; } elseif (!(oinstanceofUser)) { returnfalse; } else { Userother= (User)o; if (!other.canEqual(this)) { returnfalse; } elseif (this.id!=other.id) { returnfalse; } else { Objectthis$name=this.name; Objectother$name=other.name; if (this$name==null) { if (other$name!=null) { returnfalse; } } elseif (!this$name.equals(other$name)) { returnfalse; } returntrue; } } } protectedbooleancanEqual(Objectother) { returnotherinstanceofUser; } publicinthashCode() { intPRIME=true; intresult=1; intresult=result*59+this.id; Object$name=this.name; result=result*59+ ($name==null?43 : $name.hashCode()); returnresult; } }
@Data
包含了 @Getter and @Setter 、@ToString、@EqualsAndHashCode、@NoArgsConstructor
importlombok.Data; publicclassUser { privateintid; privateStringname; }
相当于
publicclassUser { privateintid; privateStringname; publicUser() { } publicintgetId() { returnthis.id; } publicStringgetName() { returnthis.name; } publicvoidsetId(intid) { this.id=id; } publicvoidsetName(Stringname) { this.name=name; } publicbooleanequals(Objecto) { if (o==this) { returntrue; } elseif (!(oinstanceofUser)) { returnfalse; } else { Userother= (User)o; if (!other.canEqual(this)) { returnfalse; } elseif (this.getId() !=other.getId()) { returnfalse; } else { Objectthis$name=this.getName(); Objectother$name=other.getName(); if (this$name==null) { if (other$name!=null) { returnfalse; } } elseif (!this$name.equals(other$name)) { returnfalse; } returntrue; } } } protectedbooleancanEqual(Objectother) { returnotherinstanceofUser; } publicinthashCode() { intPRIME=true; intresult=1; intresult=result*59+this.getId(); Object$name=this.getName(); result=result*59+ ($name==null?43 : $name.hashCode()); returnresult; } publicStringtoString() { return"User(id="+this.getId() +", name="+this.getName() +")"; } }