充满争议的 Lombok

简介: Lombok

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 安装即可6072892d83067c6ac49c535946c139e9.png

IDEA 2020.3 版本开始已经内置 Lombok 插件,7306d73922e7e0ab1e24f0ec4ab9f94f.png

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 / Updatef40ed008a3b2d390cdd1e9b07d6ba112.png

4、点击Quit Installer,完成安装f2ca2e1092dc080f9887d3e09a34f985.png

5、安装完成之后,确认 eclipse 安装路径下是否多了一个 lombok.jar 包,并且配置文件 eclipse.ini 中是否添加了如下内容:

-javaagent:D:\eclipse-jee-2021-03-R-win32-x86_64\eclipse\lombok.jar


Lombok 常用注解说明

Lombok注解文档

@NonNull

@Cleanup

@Getter and @Setter

@AllArgsConstructo

@RequiredArgsConstructor

@NoArgsConstructor

@ToString

@EqualsAndHashCode

@Data

@NonNull

用在成员方法或者构造方法的参数前面,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常

importlombok.NonNull;
publicclassNonNullExampleextendsSomething {
privateStringname;
publicNonNullExample(@NonNullPersonperson) {
this.name=person.getName();
    }
}

相当于

importlombok.NonNull;
publicclassNonNullExampleextendsSomething {
privateStringname;
publicNonNullExample(@NonNullPersonperson) {
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 {
@CleanupInputStreamin=newFileInputStream(args[0]);
@CleanupOutputStreamout=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 {
@Getter@Setterprivateintage;
@Setter(AccessLevel.PROTECTED)
privateStringname;
}

相当于

publicclassGetterSetterExample {
privateintage;
privateStringname;
publicintgetAge() {
returnage;
    }
publicvoidsetAge(intage) {
this.age=age;
    }
protectedvoidsetName(Stringname) {
this.name=name;
    }
}

@AllArgsConstructor / @NoArgsConstructor

在类上使用,为该类产生全参构造方法和无参构造方法

importlombok.AllArgsConstructor;
importlombok.NoArgsConstructor;
@AllArgsConstructor@NoArgsConstructorpublicclassUser {
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;
@ToStringpublicclassUser {
@ToString.Excludeprivateintid;
privateStringname;
}

相当于

publicclassUser {
privateintid;
privateStringname;
publicUser() {
    }
publicStringtoString() {
return"User(name="+this.name+")";
    }
}

@EqualsAndHashCode

生成 equals() 和 hashCode() 方法,以及 canEqual() 方法用来判断某个对象是否是当前类的实例,生成方法时只会使用类中的 非静态非transient 成员变量

  • @EqualsAndHashCode.Exclude 排除指定字段
  • @EqualsAndHashCode.Include 包含指定字段
importlombok.EqualsAndHashCode;
@EqualsAndHashCodepublicclassUser {
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;
@DatapublicclassUser {
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() +")";
    }
}
目录
相关文章
|
4月前
|
Java
lombok的使用
本文介绍了Lombok库的基本使用方法和常用注解,通过示例代码展示了如何使用Lombok简化Java对象的创建、属性访问、日志记录等编码工作,使代码更加简洁。
lombok的使用
|
4月前
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
1899 2
|
5月前
|
IDE Java 开发工具
Java 开发神器 Lombok:告别冗余,拥抱优雅!
Java 开发神器 Lombok:告别冗余,拥抱优雅!
81 0
|
7月前
|
安全 IDE Java
使用MapStruct和Lombok简化代码
使用MapStruct和Lombok简化代码
202 2
|
7月前
|
IDE Java 程序员
Lombok使用方法和总结
Lombok使用方法和总结
|
6月前
|
Java
@SneakyThrows 是 Lombok 库中的一个注解
`@SneakyThrows` 是 Lombok 库中的一个注解,它可以让你在方法签名中省略异常声明,而不需要显式地使用 try-catch 块来处理这些异常。当你使用 `@SneakyThrows` 注解时,Lombok 会自动生成相应的 try-catch 代码,将异常封装成运行时异常(通常是 `RuntimeException` 或其子类)。 这个注解在某些情况下可以简化代码,但请注意,它可能会隐藏潜在的问题,因为异常被转换成了运行时异常,这可能导致调用者无法正确处理这些异常。 下面是一个使用 `@SneakyThrows` 的示例: ```java import lombok.S
428 0
|
7月前
|
Java Maven Python
技术笔记:Lombok介绍、使用方法和总结
技术笔记:Lombok介绍、使用方法和总结
83 0
|
8月前
|
IDE Java 数据库连接
Lombok注解大全
这些是Lombok中的一些常见注解,它们可以显著减少Java代码中的冗余代码,提高代码的可读性和可维护性。不过,在使用Lombok之前,请确保你的开发环境已经配置好支持Lombok,通常需要安装相应的插件或进行设置以使IDE(如Eclipse、IntelliJ IDEA)能够正确解析Lombok注解。
62 4
|
8月前
|
IDE Java 数据库连接
Lombok注解大全
这些是Lombok中的一些常见注解,它们可以显著减少Java代码中的冗余代码,提高代码的可读性和可维护性。不过,在使用Lombok之前,请确保你的开发环境已经配置好支持Lombok,通常需要安装相应的插件或进行设置以使IDE(如Eclipse、IntelliJ IDEA)能够正确解析Lombok注解。
109 2
|
8月前
|
IDE Java 开发工具
Lombok 详解:简化 Java 开发的神奇工具
Lombok 是一款 Java 工具,通过注解自动处理如 getter/setter、toString、equals 和 hashCode 等常见代码,减少样板代码。安装 Lombok 需要在 IDE(如 IntelliJ IDEA)中添加插件,并在 Maven 或 Gradle 项目中配置依赖。常用注解包括 @Getter/@Setter 生成访问器,@ToString 生成对象描述,@EqualsAndHashCode 生成比较方法,@NoArgsConstructor/@AllArgsConstructor 生成构造器,@Data 综合应用这些注解。
427 9