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

相关推荐
根目录下的猫2 小时前
RK3588适配的轻量级AI模型推荐
人工智能·后端·python·目标检测
星栈2 小时前
用 Rust 写 Agent 服务 -- adk-rust 上手记
后端·agent
杨运交3 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
LucianaiB3 小时前
我用豆包工作 Seed-2.1-pro,复刻了 QQ 时代爆红的魔术图片
后端
码事漫谈4 小时前
智谱 ZCode 静默上传 Git 历史:48 小时信任危机复盘
后端
掘金码甲哥4 小时前
当对话模型遇上向量模型,vllm production stack 又该如何应对?
后端
传奇开心果编程4 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
IT_陈寒4 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
光影少年5 小时前
Express 中间件原理
后端·node.js·express