Lombok常用注解
# 20.Lombok常用注解
本文讲解更多关于Lombok的常用注解
# 关于get/set的注解
- @Setter:生成setter方法
- @Getter:生成getter方法
以@Getter为例,其类定义如下:
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
1
2
3
2
3
@Target的取值说明,我们可以将这两个注解,用在类和成员变量上。
- 用在类上的时候,就是所有成员变量都生成setter和getter方法;
- 而用在成员变量上的时候,就只有该成员变量会生成setter和getter。
# 关于toString方法的注解
@ToString注解能自动生成toString方法,比如之前我们是这样打印对象:
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
'}';
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
加上注解后:
@Getter
@Setter
@ToString
public class User2 {
private String name;
private String email;
private String password;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
测试:
package com.peterjxl;
public class TestToString {
public static void main(String[] args) {
User2 user = new User2();
user.setName("Peter");
user.setEmail("peterjxl@qq.com");
user.setPassword("123456");
System.out.println(user);
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
运行结果:
User2(name=Peter, email=peterjxl@qq.com, password=123456)
1
# 关于判空的注解
@NonNull
做空指针判断。该注解作用在方法参数上,用于自动生成空值参数检查,比如之前我们是这样判空的(第9行):
package com.peterjxl;
public class TestNonNull {
public static void main(String[] args) {
testNonNull(null);
}
public static void testNonNull(String name) {
if(null == name) {
throw new NullPointerException("name is null");
}
System.out.println(name);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
使用了注解之后(第17行):
package com.peterjxl;
import lombok.NonNull;
public class TestNonNull {
public static void main(String[] args) {
// testNonNull(null);
testNonNull2(null);
}
public static void testNonNull(String name) {
if(null == name) {
throw new NullPointerException("name is null");
}
System.out.println(name);
}
public static void testNonNull2(@NonNull String name) {
System.out.println(name);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行结果:
Exception in thread "main" java.lang.NullPointerException: name is marked non-null but is null
at com.peterjxl.TestNonNull.testNonNull2(TestNonNull.java:18)
at com.peterjxl.TestNonNull.main(TestNonNull.java:8)
1
2
3
2
3
# 关于构造函数的注解
-
@AllArgsConstructor
:全参构造方法 -
@NoArgsConstructor
:无参构造方法 -
@RequiredArgsConstructor
:部分参数构造方法,为所有 final 和 @NonNull 修饰的字段生成一个构造方法,这里不展开
测试:在User2上添加注解
package com.peterjxl;
import lombok.*;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User2 {
private String name;
private String email;
private String password;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
然后调用它们:
package com.peterjxl;
public class TestConstructor {
public static void main(String[] args) {
User2 user = new User2();
User2 user2 = new User2("Peter", "peterjxl@qq.com", "123456");
System.out.println(user);
System.out.println(user2);
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
输出:
User2(name=null, email=null, password=null)
User2(name=Peter, email=peterjxl@qq.com, password=123456)
1
2
2
# 关于equals和hashcode的注解
@EqualsAndHashCode,可以帮我们生成equals和hashcode注解。
加上:
package com.peterjxl;
import lombok.*;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class User2 {
private String name;
private String email;
private String password;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
测试:
package com.peterjxl;
public class TestEqualsAndHashCode {
public static void main(String[] args) {
User2 user = new User2();
user.setName("Peter");
user.setEmail("peterjxl@qq.com");
user.setPassword("123456");
System.out.println(user.getName());
System.out.println(user);
System.out.println(user.hashCode());
User2 user2 = new User2();
user2.setName("Peter");
user2.setEmail("peterjxl@qq.com");
user2.setPassword("123456");
System.out.println(user.equals(user2));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
输出:
Peter
User2(name=Peter, email=peterjxl@qq.com, password=123456)
1764516877
true
1
2
3
4
2
3
4
# 综合注解
@Data注解只能作用在类上,其相当于多个注解:@Getter/@Setter,@ToString/@EqualsAndHashCode
源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {
1
2
3
2
3
测试:新建一个User3
package com.peterjxl;
import lombok.Data;
@Data
public class User3 {
private String name;
private String email;
private String password;
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
调用:
package com.peterjx;
public class TestData {
public static void main(String[] args) {
User3 user = new User3();
user.setName("Peter");
user.setEmail("peterjxl@qq.com");
user.setPassword("123456");
System.out.println(user.getName());
System.out.println(user);
System.out.println(user.hashCode());
User3 user2 = new User3();
user2.setName("Peter");
user2.setEmail("peterjxl@qq.com");
user2.setPassword("123456");
System.out.println(user.equals(user2));
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
输出结果:
Peter
User3(name=Peter, email=peterjxl@qq.com, password=123456)
1764516877
true
1
2
3
4
2
3
4
# 更多注解
受限于篇幅限制,只介绍了一些常用的注解。除此之外,还有:
-
@Builder
:可以通过链式表达的方式创建对象 -
@Cleanup
:作用在变量上,可以自动关闭资源(替换try-close) -
@SneakyThrows
:作用在方法上,用于抛出异常。例如一个IO的方法,要抛出IO的异常,使用该注解后就不用写了。 -
@Log
:为类自动生成 log 日志记录 -
@Synchronized
:为类方法或实例方法自动生成 synchronized 保护 - ...............
# 源码
已将本文源码上传到Gitee (opens new window)或GitHub (opens new window) 的分支demo2,读者可以通过切换分支来查看本文的示例代码
在GitHub上编辑此页 (opens new window)
上次更新: 2023/7/11 10:04:34