@AllArgsConstructor 是 Lombok 提供的注解

@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 使用,能让代码保持简洁的同时不失灵活性。

相关推荐
UrbanJazzerati6 小时前
AutoHotkey v2 零基础快速入门 Part 10:给路线回放添加高精度计时,理解累计延迟与路线一致性
后端
70后写java的老码农6 小时前
Spring Boot 3 + ShardingSphere-JDBC 实战:一次把读写分离和分库分表跑通
后端
泡海椒6 小时前
04-饼图评级构成-信用评级构成
后端
知守观6 小时前
多模块架构演进:横向分层 vs 纵向领域,13 个真实项目的切分对照
java·后端·微服务
系统集成-鹰翔7 小时前
ERP推单数据库怎么备份:SQLite WAL模式下只复制db文件为什么可能漏任务
javascript·数据库·经验分享·后端
软件技术NINI8 小时前
基于SpringBoot和Vue的摇滚乐鉴赏网站
vue.js·spring boot·后端·spring·html·毕业设计·毕设
Tsuki_tl8 小时前
【总结】Redis五大数据类型应用场景及基本命令
数据库·redis·后端·缓存·缓存中间件·redis命令·redis 五大数据类型
后台模板学习8 小时前
Go Web开发中任务调度框架的源码解析与高可用实现方案
开发语言·后端·golang
系统集成-鹰翔8 小时前
ERP对接升级提示数据库迁移失败:SQLite逐版本事务到底回滚到哪一步
javascript·数据库·经验分享·后端
IT_陈寒8 小时前
深入理解SpringBoot:核心原理与最佳实践
前端·人工智能·后端