Lombok 核心注解详解(@Data、@NoArgsConstructor、@AllArgsConstructor)
你想先全面了解Lombok的核心作用,再重点掌握@Data、@NoArgsConstructor、@AllArgsConstructor这三个注解的用法,以及它们组合使用的场景和最佳实践,我会从基础到实战一步步讲清楚。
一、先搞懂:Lombok 是什么?能解决什么问题?
Lombok 是一款 Java 开发的注解式工具,核心作用是消除样板代码——Java 中实体类(POJO/Bean)通常需要写大量重复的 getter/setter、构造器、toString、equals/hashCode 等方法,这些代码机械且无业务逻辑,Lombok 能通过简单注解自动生成这些代码,让类代码更简洁、易维护。
核心优势:
- 减少代码量:一行注解替代几十行重复代码;
- 降低维护成本:修改字段时,无需手动修改对应的 getter/setter、构造器等;
- 避免低级错误:手动写构造器/toString 时易漏字段,Lombok 生成的代码更规范。
前置条件(必须配置):
- 项目引入 Lombok 依赖(以 Maven 为例);
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version> <!-- 推荐最新稳定版 -->
<scope>provided</scope> <!-- 仅编译期生效,不打入包中 -->
</dependency>
- IDE 安装 Lombok 插件(IDEA/Eclipse):否则编辑器会提示“找不到方法”(但编译能通过)。

二、核心注解详解
1. @Data:一站式“懒人注解”(组合注解)
@Data 是 Lombok 最常用的组合注解,它整合了多个基础注解的功能,能一次性解决大部分样板代码问题。
作用:
自动为类生成:
getter方法(所有非静态字段);setter方法(所有非 final 字段);toString()方法(包含所有字段);equals()和hashCode()方法(基于所有非静态字段);canEqual()方法(辅助 equals 判定)。
⚠️ 关键注意:@Data 不包含构造器(无参/全参都不生成),这是它需要和构造器注解配合的核心原因。
基础用法:
import lombok.Data;
@Data
public class User {
private Long id; // 非final字段,生成getter+setter
private String name; // 非final字段,生成getter+setter
private final Integer age = 18; // final字段,仅生成getter(无setter)
}
等价手动编写的代码(Lombok 自动生成):
public class User {
private Long id;
private String name;
private final Integer age = 18;
// 自动生成getter
public Long getId() { return id; }
public String getName() { return name; }
public Integer getAge() { return age; }
// 自动生成setter(final字段无setter)
public void setId(Long id) { this.id = id; }
public void setName(String name) { this.name = name; }
// 自动生成toString
@Override
public String toString() {
return "User(id=" + id + ", name=" + name + ", age=" + age + ")";
}
// 自动生成equals+hashCode
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) && Objects.equals(name, user.name) && Objects.equals(age, user.age);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age);
}
// 自动生成canEqual
protected boolean canEqual(Object other) {
return other instanceof User;
}
}
2. @NoArgsConstructor:生成无参构造器
作用:
为类生成无参构造方法(默认 public 权限),满足框架反射创建对象的需求(如 Spring、MyBatis、Jackson 等框架都依赖无参构造)。
关键参数:
access:指定构造器权限(可选PUBLIC/PROTECTED/PACKAGE/PRIVATE);force:强制为final字段生成无参构造(会给 final 字段赋默认值:null/0/false),否则有 final 字段时编译报错。
基础用法:
import lombok.NoArgsConstructor;
@NoArgsConstructor // 生成public无参构造
public class User {
private Long id;
private String name;
}
带 final 字段的用法:
import lombok.NoArgsConstructor;
import lombok.AccessLevel;
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true) // 私有无参构造+强制处理final字段
public class User {
private final Long id; // final字段,Lombok自动赋默认值null
private String name;
}
3. @AllArgsConstructor:生成全参构造器
作用:
为类生成包含所有非静态、非 transient 字段的构造器,参数顺序与字段声明顺序一致(默认 public 权限),方便业务代码中快速创建对象。
关键参数:
access:指定构造器权限;staticName:生成静态工厂方法(替代直接 new 构造器,更符合设计模式)。
基础用法:
import lombok.AllArgsConstructor;
@AllArgsConstructor // 生成public全参构造
public class User {
private Long id;
private String name;
private Integer age;
}
带静态工厂方法的用法:
import lombok.AllArgsConstructor;
@AllArgsConstructor(staticName = "of") // 生成静态工厂方法of()
public class User {
private Long id;
private String name;
}
// 使用:User user = User.of(1L, "张三"); 替代 new User(1L, "张三")
三、三个注解组合使用(实战最佳实践)
@Data + @NoArgsConstructor + @AllArgsConstructor 是 Java 实体类的黄金组合,既能解决所有样板代码问题,又能满足框架和业务的双重需求。
完整示例:
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
// 组合注解:getter/setter + toString + equals/hashCode + 无参构造 + 全参构造
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String phone;
}
使用场景演示:
public class TestUser {
public static void main(String[] args) {
// 1. 无参构造(框架反射用)
User user1 = new User();
user1.setId(1L);
user1.setName("张三");
user1.setAge(20);
// 2. 全参构造(业务代码快速创建对象)
User user2 = new User(2L, "李四", 22, "13800138000");
// 3. @Data提供的toString/getter等方法
System.out.println(user2); // 自动生成的toString:User(id=2, name=李四, age=22, phone=13800138000)
System.out.println(user2.getName()); // getter方法
System.out.println(user1.equals(user2)); // equals方法
}
}
组合使用的核心价值:
- 满足框架要求:
@NoArgsConstructor保证 Spring/MyBatis 等框架能反射创建对象; - 提升开发效率:
@AllArgsConstructor让业务代码无需多次调用 setter 就能创建完整对象; - 简化代码维护:修改字段时,无需手动修改 getter/setter、构造器、toString 等方法。
总结
- Lombok 核心:通过注解自动生成 Java 实体类的样板代码,减少重复工作,降低维护成本;
- @Data:一站式生成 getter/setter、toString、equals/hashCode,但不包含构造器;
- @NoArgsConstructor:生成无参构造器,满足框架反射需求;
@AllArgsConstructor:生成全参构造器,方便业务创建对象; - 组合使用:
@Data + @NoArgsConstructor + @AllArgsConstructor是实体类的最优解,兼顾框架兼容性和开发效率。
⚠️ 额外提醒:使用 Lombok 时,团队需统一规范(避免部分人用、部分人不用),且 IDE 必须安装插件,否则会影响代码可读性。
更多推荐




所有评论(0)