@AllArgsConstructor 是 Lombok 提供的注解,作用是为类生成一个包含所有字段的构造方法。
用法很简单:
java
@AllArgsConstructor
public class User {
private Long id;
private String name;
private String email;
}
编译后等价于:
java
public class User {
private Long id;
private String name;
private String email;
public User(Long id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
}
生成的构造方法默认访问权限是 public。如果希望构造方法不对外暴露,用 access 属性控制:
java
@AllArgsConstructor(access = AccessLevel.PRIVATE)
这样构造方法变成私有的,通常配合 staticName 一起使用,提供一个静态工厂方法:
java
@AllArgsConstructor(staticName = "of")
public class User {
private Long id;
private String name;
}
// 使用
User user = User.of(1L, "张三");
staticName 会生成一个返回当前类实例的静态方法,构造方法本身变为私有。这种方式比直接 new 更语义化,也便于后续扩展------将来可以在工厂方法里添加缓存、校验等逻辑,而调用方不需要改动。
@AllArgsConstructor 和 @NoArgsConstructor 经常一起使用,JPA 实体类需要无参构造方法,而业务代码中又希望使用全参构造方法快速创建对象:
java
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
@Id
private Long id;
private String name;
}
它和 @RequiredArgsConstructor 的区别在于:@AllArgsConstructor 生成包含所有字段的构造方法,包括 null 字段;@RequiredArgsConstructor 只生成包含 final 字段或 @NonNull 字段的构造方法。
和 @Builder 结合使用时,@AllArgsConstructor 是 @Builder 能够工作的前提。@Builder 生成的 Builder 类内部需要调用全参构造方法:
java
@Builder
@AllArgsConstructor
public class User {
private Long id;
private String name;
}
如果不写 @AllArgsConstructor,@Builder 会尝试生成一个包内可见的全参构造方法,但如果你同时写了其他构造方法,可能导致 @Builder 失效。显式加上 @AllArgsConstructor 是最稳妥的做法。
注意事项:
- 继承场景下,
@AllArgsConstructor不会处理父类字段,生成的构造方法只包含当前类的字段。子类的构造方法需要显式调用super(),或使用@SuperBuilder解决。 - 字段顺序与构造方法参数顺序一致,依赖声明顺序。重构时调整字段顺序可能影响构造方法的调用方,但编译期会报错,相对安全。
- 与 JSON 序列化框架配合时,Jackson 和 Gson 默认使用无参构造方法或通过反射直接赋值,全参构造方法不是必需的。但有些框架(如某些配置绑定场景)会优先使用带参构造方法,
@AllArgsConstructor可以支持不可变对象的反序列化。 - 字段数量过多时,全参构造方法的参数列表会很长,超过 7 个参数可读性就会下降。这种情况考虑使用
@Builder替代,或拆分类的职责。
@AllArgsConstructor 是 Lombok 里最简单直接的注解之一,核心价值就是省去手动编写全参构造方法的重复劳动。在 DTO、VO、实体类中配合 @Data 或 @Builder 使用,能让代码保持简洁的同时不失灵活性。