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

相关推荐
柠檬味拥抱16 分钟前
鸿蒙原生 AI 应用开发实战:用蓝耘 MaaS 给纪念日 App 装上「大模型大脑」
后端
步行cgn19 分钟前
Lombok 详解:通过注解消除样板代码
后端
用户411800341534119 分钟前
MySql 事务和锁
后端
一只小闪闪27 分钟前
easy-trans java数据通用翻译框架v2.3.0
java·后端·架构
2601_9620558129 分钟前
Spring全部注解
java·后端·spring
步行cgn1 小时前
Spring Boot 启动报错:MissingServletWebServerFactoryBean 的排查与解决
java·spring boot·后端
步行cgn2 小时前
Spring Boot 项目打包部署详解
java·spring boot·后端
我的xiaodoujiao2 小时前
Django 基础知识详细图文教程 4-Django 视图定义与使用
开发语言·数据库·后端·测试工具·django·sqlite
Apifox3 小时前
Apifox 8 月更新|调试、权限与协作体验持续优化
前端·后端·测试