Lombok

Lombok

这里给大家介绍一个插件 Lombok ,它可以使用注解的方式来帮助我们来实现set,get,构造方法和一些其他的方法,比如equals,toString等,省去了写代码的重复工作,当修改代码的同时,不需要再去修改一些重复的方法,减轻负担。

安装

和平常的插件安装相仿,在设置的插件里面搜索Lombok,安装即可

引入

可以通过jar方式引入,然后导入,也可以直接通过maven方式引入坐标

1
2
3
4
5
6
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>provided</scope>
</dependency>

使用

注解详情

@NonNull @Getter @Setter @ Cleanup @ToString @EqualsAndHashCode

@NoArgsConstructor @RequiredArgsConstructor @AllArgsConstructor

@Data

NonNull

用在获取属性或者构造器上,Lombok生成一个非空声明,用于校验参数,避免空指针的生成

1
2
3
4
5
6
7
8
9
10
11
12
public class Lom {
public String name;
public String getName(@NonNull Lom lom){
return lom.name;
}
@Test
public void test(){
Lom lom = new Lom();
System.out.println(lom.getName(null));
}
//在运行时则会报错,显示这是一个null,不能放到getName方法中当实参
}

Getter Setter

作用在成员属性上,为属性生成getter和setter方法,默认生成的权限修饰符时public,也可以通过传参的方法来更改生成方法的权限

1
2
3
4
5
6
7
8
9
10
11
public class Lom {
@Getter
@Setter
public String name;
@Test
public void test(){
Lom lom = new Lom();
lom.setName("hahah");
System.out.println(lom.getName());
}
}

下面是拥有子类时

1
2
3
4
5
6
7
8
9
10
11
public class Lom {
@Getter(AccessLevel.PRIVATE)
@Setter(AccessLevel.PRIVATE)
public String name;
@Test
public void test(){
Lom lom = new Lom();
lom.setName("hahah");
System.out.println(lom.getName());
}
}
1
2
3
4
5
6
7
public class son extends Lom{
@Test
public void test(){
son s = new son();
System.out.println(s.getName());
}
}

Cleanup

这个用在变量前面,可以保证变量代表的资源会被关闭,例如输入输出流,这个注解默认调用close方法,如果这个资源有其他的关闭方法,则使用 @Cleanup(“method_name”);

ToString

该注解会自动重写对应的toString方法,默认情况下输出全部的属性

@ToString.Include(rank = -1)用到属性上,默认为0,rank值越大先打印

将某个方法的输出附加到本类的toString后面,只能是non-static的无参方法,@ToString.Include用到方法上,@ToString(includeFieldNames=true)加到类上

1
2
3
4
5
6
7
8
9
@ToString
public class Lom {
public String name;
@Test
public void test(){
Lom lom = new Lom();
System.out.println(lom);
}
}

通过引入参数,可以选择性的包含哪个属性

1
2
3
4
5
6
7
8
9
10
11
@ToString(exclude = {"name"})//去除了name属性 @ToString(exclude = {"name","age"}) 去除了name和age属性
// @ToString(of = {"name"}) 只包含name @ToString(of = {"name","age"}) 只包含name和age
public class Lom {
public String name;
public String age;
@Test
public void test(){
Lom lom = new Lom();
System.out.println(lom);
}
}

EqualsAndHashCode

默认情况下,生成不包含static和transient的equal和hashcode方法

和ToString类似,可以通过exclude选择性去除一些属性

1
2
3
4
5
6
7
8
9
10
11
@EqualsAndHashCode(exclude = {"name"}, callSuper = false)
public class Lom {
public String name;
public String age;
@Test
public void test(){
Lom lom_1 = new Lom();
Lom lom_2 = new Lom();
System.out.println(lom_1.equals(lom_2));
}
}

callSuper 比较两个子类从父类继承来的字段,如果为false,则不比较从父类继承来的字段,如果为true,则比较

NoArgsConstructor RequiredArgsConstructor AllArgsConstructor

NoArgsConstructor 和 AllArgsConstructor生成不包含属性的构造方法和包含所有属性的构造方法

三个注解都可以设置生成方法的权限和 Getetr ,Setter 类似

RequiredArgsConstructor 注解为类中所有带有 @NonNull 或者 带有final 修饰的成员变量生成的成员变量生成对应的构造方法

如果类中存在 finall 修饰的成员变量,AllArgsConstructor 不能使用 不能给 final 变量赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@NoArgsConstructor
@AllArgsConstructor

public class Lom {
public final String car_ = "aaa";
public String name;
public String age;
// Lom(String name,String age,String car_){
// this.name = name;
// this.age = age;
// this.car_ = car_;
// }
@Test
public void test(){
Lom lom_1 = new Lom("smg","age");
}
}

Data

会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法

1
2
3
4
5
6
7
8
9
10
@Data
public class Lom {
public String name;
public String age;
@Test
public void test(){
Lom lom_1 = new Lom();
System.out.println(lom_1);
}
}

Lombok
http://example.com/2024/02/13/lombok/
作者
smg
发布于
2024年2月13日
许可协议