前言
Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java bean代码的冗长,虽然IDE也可以帮我们自动生成Get、Set方法,但代码里充斥着这些方法也会显得不直观。
Lombok通过注解实现帮我们简化代码,比如下边这段代码:
public class GetSetTest {
private String name;
private LocalDate date;
public String getName() {
return this.name;
}
public LocalDate getDate() {
return this.date;
}
public void setName(String name) {
this.name = name;
}
public void setDate(LocalDate date) {
this.date = date;
}
}
而使用lombok只需要添加一个注解即可达到一样的效果:
@Data
public class GetSetTest {
private String name;
private LocalDate date;
}
Lombok本质上是在编译时进行解析,给java文件增加新的代码。
引用
Lombok引用非常简单,首先需要引入Lombok包:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
再在你的IDE中安装Lombok插件,就可以开始了!
使用
@NonNull
该注解用于标注字段、方法、方法参数上,在类初始化时会检查是否为空,否则抛出空指针异常。
@Getter @Setter
正如这两个单词所代表的语义,用以生成字段的get和set方法。该注解可以标注在类上,也可以标注在字段上。
@ToString
**@ToString ******注解用于自动生成便于查看的类的ToString方法,该注解有以下几个可选参数:
includeFieldNames
boolean 类型,默认为true,是否包含字段,exclude
String[]类型,不包含的字段of
String[]类型,包含的字段callSuper
doNotUseGetters
@EqualsAndHashCode
@EqualsAndHashCode
注解作用于类上,该注解会自动生成一个equals和hashCode方法,其中equals方法会根据所有的字段值判断equals的结果
@EqualsAndHashCode
public class EqualsAndHashCodeTest {
private String name;
}
// 实际生成的代码
public class EqualsAndHashCodeTest {
private String name;
public boolean equals(final Object o) {
if (o == this) return true;
if (!(o instanceof EqualsAndHashCodeTest)) return false;
final EqualsAndHashCodeTest other = (EqualsAndHashCodeTest) o;
if (!other.canEqual((Object) this)) return false;
final Object this$name = this.name;
final Object other$name = other.name;
if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false;
return true;
}
protected boolean canEqual(final Object other) {
return other instanceof EqualsAndHashCodeTest;
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
final Object $name = this.name;
result = result * PRIME + ($name == null ? 43 : $name.hashCode());
return result;
}
}
构造函数相关注解
- @NoArgsConstructor
@NoArgsConstructor
注解会生成一个无参构造器,**但对于final字段或有@NoNull注解的字段,使用该注解会报错。**可以通过@NoArgsConstructor(force = true)
参数,强制执行创建无参数构造器,这时final字段会初始化为0
/false
/null
。 - @RequiredArgsConstructor
@RequiredArgsConstructor
注解与@NoArgsConstructor
相对,在默认情况下会生成一个无参构造器,在有final字段或有@NoNull注解的字段,会生成带有这些字段的构造器。
@RequiredArgsConstructor
public class ArgsConstructorTest {
@NonNull
private String name;
private int age;
}
// 实际生成的代码
public class ArgsConstructorTest {
@NonNull
private String name;
private int age;
public ArgsConstructorTest(String name) {
this.name = name;
}
}
@AllArgsConstructor
该注解会生成一个全参数构造器。
注意:
这三个构造器注解并不会影响类中原先自己书写的构造器。
@Data
@Data
是一个集合体。包含Getter
,Setter``,RequiredArgsConstructor
,ToString
,EqualsAndHashCode
@Builder
生成可以使用构造器模式的代码,是类字段赋值变得简洁
@Builder
@Data
public class BuilderTest {
private String name;
private int age;
private String type;
}
使用该注解后,类字段就可以像下边这样赋值:
BuilderTest builderTest = BuilderTest.builder()
.age(1)
.name("")
.type("")
.build();