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

相关推荐
苍何6 小时前
开源微信流 Windows,微信聊天记录,可以直接给 Codex 和 Obsidan 了
后端
代码什么用7 小时前
Spring基础使用
java·后端·spring
明月_清风8 小时前
Deno 终局来了:从挑战 Node 到被 Cloudflare 收编
前端·后端·node.js
蜗牛互联网8 小时前
Java 17 HttpClient调用文件转写API的超时与失败回退
java·人工智能·后端
用户693717500138410 小时前
2026,程序员的时代拐点到了
android·前端·后端
惜鸟11 小时前
从源码看 pi 的上下文管理:原始数据永久保留,模型视角按需裁剪
后端
量化分析码农11 小时前
【Python量化策略评估体系 #05】极端行情扛得住吗?2008/2015/2020 三场景压力测试
后端
十年Java程序媛11 小时前
Java 接口和抽象类对比|Java8 新特性,抛弃老旧八股,正确选型
java·spring boot·后端
IT_陈寒11 小时前
SpringBoot自动配置差点让我加班到凌晨
前端·人工智能·后端
用户83562907805111 小时前
使用 Python 对 Excel 工作表进行排序
后端·python