@RequiredArgsConstructor和@AllArgsConstructor的区别
@RequiredArgsConstructor
和 AllArgsConstructor
是 Lombok 库中用于自动生成构造方法的两个常用注解,它们的核心区别在于生成构造方法的参数范围不同。以下是详细对比:
1. 参数范围
注解 | 生成的构造方法包含的字段 |
---|---|
@RequiredArgsConstructor | 仅包含必须初始化的字段: - final 修饰的非静态字段- 使用 @NonNull 注解且未在声明时赋值的非静态字段 |
@AllArgsConstructor | 包含所有非静态字段(无论是否已初始化或是否为 final ) |
2. 示例对比
假设有以下类定义:
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.NonNull;public class Example {private final String id; // final 字段@NonNull private String name; // @NonNull 注解字段(未初始化)private int age = 18; // 已初始化的普通字段private static String country; // 静态字段(不会被包含)
}
使用 @RequiredArgsConstructor
生成的构造方法参数仅包含必须初始化的字段:
public Example(String id, String name) {this.id = id;if (name == null) throw new NullPointerException("name is marked non-null but is null");this.name = name;
}
使用 @AllArgsConstructor
生成的构造方法参数包含所有非静态字段(无论是否初始化):
public Example(String id, String name, int age) {this.id = id;this.name = name;this.age = age;
}
3. 使用场景
注解 | 适用场景 |
---|---|
@RequiredArgsConstructor | 当需要强制初始化某些关键字段(如 final 字段或 @NonNull 字段)时,避免遗漏必要的参数。 |
@AllArgsConstructor | 当需要快速生成一个包含所有字段的构造方法(例如用于测试、反射等场景),但需注意字段可能过多导致参数列表冗长。 |
4. 注意事项
- 静态字段:无论是
@RequiredArgsConstructor
还是@AllArgsConstructor
,静态字段均不会被包含在构造方法中。 - 初始化字段:
@RequiredArgsConstructor
会忽略已初始化的非final
字段,而@AllArgsConstructor
会包含所有非静态字段(无论是否已初始化)。 - 安全性:
@RequiredArgsConstructor
会为@NonNull
字段生成空值检查逻辑,而@AllArgsConstructor
不会自动生成空值检查。
总结
- 如果需要生成仅包含必要初始化字段的构造方法,选择
@RequiredArgsConstructor
。 - 如果需要生成覆盖所有非静态字段的构造方法,选择
@AllArgsConstructor
。