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,读者可以通过切换分支来查看本文的示例代码
上次更新: 2024/10/1 21:14:36