搜索 K
Appearance
博客正在加载中...
Appearance
本文讲解更多关于 Lombok 的常用注解
以@Getter 为例,其类定义如下:
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {@Target 的取值说明,我们可以将这两个注解,用在类和成员变量上。
@ToString 注解能自动生成 toString 方法,比如之前我们是这样打印对象:
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", password='" + password + '\'' +
'}';
} 加上注解后:
@Getter
@Setter
@ToString
public class User2 {
private String name;
private String email;
private String password;
} 测试:
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);
}
} 运行结果:
User2(name=Peter, email=peterjxl@qq.com, password=123456)@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);
}
} 使用了注解之后(第 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);
}
} 运行结果:
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)@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;
} 然后调用它们:
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);
}
} 输出:
User2(name=null, email=null, password=null)
User2(name=Peter, email=peterjxl@qq.com, password=123456)@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;
} 测试:
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));
}
} 输出:
Peter
User2(name=Peter, email=peterjxl@qq.com, password=123456)
1764516877
true
@Data 注解只能作用在类上,其相当于多个注解:@Getter/@Setter,@ToString/@EqualsAndHashCode 源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface Data {测试:新建一个 User3
package com.peterjxl;
import lombok.Data;
@Data
public class User3 {
private String name;
private String email;
private String password;
} 调用:
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));
}
} 输出结果:
Peter
User3(name=Peter, email=peterjxl@qq.com, password=123456)
1764516877
true
受限于篇幅限制,只介绍了一些常用的注解。除此之外,还有:
@Builder:可以通过链式表达的方式创建对象@Cleanup:作用在变量上,可以自动关闭资源(替换 try-close)@SneakyThrows:作用在方法上,用于抛出异常。例如一个 IO 的方法,要抛出 IO 的异常,使用该注解后就不用写了。@Log:为类自动生成 log 日志记录@Synchronized:为类方法或实例方法自动生成 synchronized 保护