IntelliJ 安装 Lombok
Lombok 注解大全说明
-
@NonNull
:给方法参数增加这个注解,会自动在方法内对该参数进行是否为空的校验,如果为空,则抛出 NPE(NullPointerException) -
@Getter/@Setter
:用在属性上,再也不用自己手写 setter 和 getter 方法了,还可以指定访问范围 -
@ToString
:用在类上,可以自动覆写 toString 方法,当然还可以加其他参数,例如@ToString(exclude=”id”)排除 id 属性,或者@ToString(callSuper=true, includeFieldNames=true)调用父类的 toString 方法,包含所有属性 -
@EqualsAndHashCode
:用在类上,自动生成 equals 方法和 hashCode 方法 -
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
:用在类上,自动生成无参构造和使用所有参数的构造函数以及把所有@NonNull 属性作为参数的构造函数,如果指定 staticName = “of”参数,同时还会生成一个返回类对象的静态工厂方法,比使用构造函数方便很多 -
@Data
:注解在类上,相当于同时使用了@ToString、@EqualsAndHashCod- e、@Getter、@Setter 和@RequiredArgsConstrutor 这些注解,对于 POJO 类十分有用 -
@Value
:用在类上,是@Data 的不可变形式,相当于为属性添加 final 声明,只提供 getter 方法,而不提供 setter 方法 -
@Builder
:用在类、构造器、方法上,为你提供复杂的 builder APIs,让你可以像如下方式一样调用 Person.builder().name("Adam Savage").city("San Francisco").job("Mythbusters").job("Unchained Reaction").build();更多说明参考 Builder -
@Getter(lazy=true)
:可以替代经典的 Double Check Lock 样板代码 -
@Log
:根据不同的注解生成不同类型的 log 对象,但是实例名称都是 log,有六种可选实现
@CommonsLog
Creates log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
@Log
Creates log = java.util.logging.Logger.getLogger(LogExample.class.getName());
@Log4j
Creates log = org.apache.log4j.Logger.getLogger(LogExample.class);
@Log4j2
Creates log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
@Slf4j
Creates log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
@XSlf4j
Creates log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
代码示例
@NonNull
import lombok.NonNull;
public class Person {
private String name;
private int age;
public Person(@NonNull String name, int age) {
this.name = name;
this.age = age;
}
public void setName(@NonNull String name) {
this.name = name;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
测试类:
public class Main {
public static void main(String[] args) {
try {
// 传入 null,会抛出 NullPointerException
Person person1 = new Person(null, 25);
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException for person1: " + e.getMessage());
}
Person person2 = new Person("John", 30);
try {
// 调用 setName 方法传入 null,会抛出 NullPointerException
person2.setName(null);
} catch (NullPointerException e) {
System.out.println("Caught NullPointerException for person2: " + e.getMessage());
}
}
}
@EqualsAndHashCode
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter 和 Setter 可以根据需要添加
}
测试类:
public class Main {
public static void main(String[] args) {
Person person1 = new Person("John", 25);
Person person2 = new Person("John", 25);
Person person3 = new Person("Jane", 30);
// 使用 Lombok 生成的 equals() 方法进行比较
System.out.println("person1 equals person2: " + person1.equals(person2)); // 应输出 true
System.out.println("person1 equals person3: " + person1.equals(person3)); // 应输出 false
// 使用 Lombok 生成的 hashCode() 方法进行比较
System.out.println("person1 hashCode: " + person1.hashCode());
System.out.println("person2 hashCode: " + person2.hashCode());
System.out.println("person3 hashCode: " + person3.hashCode());
}
}
运行结果:
person1 equals person2: true
person1 equals person3: false
person1 hashCode: <hash_code_value_1>
person2 hashCode: <hash_code_value_1>
person3 hashCode: <hash_code_value_2>