在 Java 中,生成构造方法的注解主要来自 Lombok 库(最常用)和其他一些框架。
以下是详细的分类说明:
Lombok 在编译时自动生成代码,无需手动编写构造方法。
@NoArgsConstructor
public class User {
private String name;
private int age;
}
编译后生成:
public User() {}
@AllArgsConstructor
public class User {
private String name;
private int age;
}
编译后生成:
public User(String name, int age) {
this.name = name;
this.age = age;
}
@RequiredArgsConstructor
public class User {
private final String id; // final 字段必选
@NonNull private String name; // @NonNull 字段必选
private int age; // 普通字段不包含
}
编译后生成:
public User(String id, String name) {
if (name == null) throw new NullPointerException("name is marked non-null");
this.id = id;
this.name = name;
}
@Builder
public class User {
private String name;
private int age;
}
可通过链式调用创建对象:
User user = User.builder().name("Tom").age(25).build();
List<User> list= Arrays.asList(
User.builder().id(1L).userName("java").userAccount("java").build(),
User.builder().id(2L).userName("张三").userAccount("25").build(),
User.builder().id(3L).userName("李四").userAccount("30").build(),
User.builder().id(4L).userName("王五").userAccount("33").build()
);
@Entity
实体类默认需要无参构造器(隐式生成):
@Entity
public class User {
@Id
private Long id;
private String name;
// 即使不写,JPA 运行时也会通过反射调用无参构造器
}
@JsonCreator
用于自定义构造方法处理 JSON:
public class User {
private String name;
private int age;
@JsonCreator
public User(@JsonProperty("name") String name,
@JsonProperty("age") int age) {
this.name = name;
this.age = age;
}
}
如 Google AutoValue 或 Immutables:
@AutoValue
public abstract class User {
abstract String name();
abstract int age();
// 自动生成全参构造方法
public static User create(String name, int age) {
return new AutoValue_User(name, age);
}
}
注解类型 | 注解 | 作用 | 使用场景 |
---|---|---|---|
Lombok | @NoArgsConstructor | 生成无参构造方法 | POJO/DTO 类 |
@AllArgsConstructor | 生成全参构造方法 | 需要快速初始化所有字段 | |
@RequiredArgsConstructor | 生成 final/@NonNull 字段构造 | 必选参数场景 | |
@Builder | 生成 Builder 模式构造 | 复杂对象创建 | |
JPA/Hibernate | @Entity (隐式) | 要求有无参构造器 | 数据库实体类 |
Jackson | @JsonCreator | 自定义 JSON 反序列化构造 | 特殊格式 JSON 解析 |
Immutable 框架 | @AutoValue | 自动生成不可变类构造 | 线程安全/值对象 |
@Data // 生成 getter/setter/toString/equals/hashCode
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private int age;
}
等价于手动编写 120+ 行代码!
Lombok 需安装插件:
IDE 需装 Lombok 插件(IntelliJ/Eclipse)
Maven/Gradle 需添加依赖:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.28</version>
<scope>provided</scope>
</dependency>
JPA 实体类要求:
@NoArgsConstructor
)protected
Builder 模式覆盖默认构造:
@Builder
后,默认无参构造器会被覆盖@NoArgsConstructor
和 @AllArgsConstructor
推荐优先使用 Lombok,可减少 30% 以上的样板代码!