你想先全面了解Lombok的核心作用,再重点掌握@Data@NoArgsConstructor@AllArgsConstructor这三个注解的用法,以及它们组合使用的场景和最佳实践,我会从基础到实战一步步讲清楚。

一、先搞懂:Lombok 是什么?能解决什么问题?

Lombok 是一款 Java 开发的注解式工具,核心作用是消除样板代码——Java 中实体类(POJO/Bean)通常需要写大量重复的 getter/setter、构造器、toString、equals/hashCode 等方法,这些代码机械且无业务逻辑,Lombok 能通过简单注解自动生成这些代码,让类代码更简洁、易维护。

核心优势:

  1. 减少代码量:一行注解替代几十行重复代码;
  2. 降低维护成本:修改字段时,无需手动修改对应的 getter/setter、构造器等;
  3. 避免低级错误:手动写构造器/toString 时易漏字段,Lombok 生成的代码更规范。

前置条件(必须配置):

  1. 项目引入 Lombok 依赖(以 Maven 为例);
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version> <!-- 推荐最新稳定版 -->
    <scope>provided</scope> <!-- 仅编译期生效,不打入包中 -->
</dependency>
  1. 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方法
    }
}

组合使用的核心价值:

  1. 满足框架要求:@NoArgsConstructor 保证 Spring/MyBatis 等框架能反射创建对象;
  2. 提升开发效率:@AllArgsConstructor 让业务代码无需多次调用 setter 就能创建完整对象;
  3. 简化代码维护:修改字段时,无需手动修改 getter/setter、构造器、toString 等方法。

总结

  1. Lombok 核心:通过注解自动生成 Java 实体类的样板代码,减少重复工作,降低维护成本;
  2. @Data:一站式生成 getter/setter、toString、equals/hashCode,但不包含构造器
  3. @NoArgsConstructor:生成无参构造器,满足框架反射需求;@AllArgsConstructor:生成全参构造器,方便业务创建对象;
  4. 组合使用@Data + @NoArgsConstructor + @AllArgsConstructor 是实体类的最优解,兼顾框架兼容性和开发效率。

⚠️ 额外提醒:使用 Lombok 时,团队需统一规范(避免部分人用、部分人不用),且 IDE 必须安装插件,否则会影响代码可读性。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐