Lombok 包底层浅析

Lombok 是 Java 最常用的代码简化工具包 ,它能通过注解 自动生成 getter、setter、构造方法、toString 等代码,不用手写重复代码!


一、Lombok 到底能干什么?

不用写:

  • getXxx()
  • setXxx()
  • toString()
  • equals() / hashCode()
  • 无参/全参构造器
  • 日志对象 log

只需要加几个注解,代码瞬间变干净!


二、Maven 依赖(直接复制)

在 pom.xml 里加:

xml 复制代码
<!-- Lombok 核心依赖 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>

Gradle 版本:

groovy 复制代码
compileOnly 'org.projectlombok:lombok:1.18.30'
annotationProcessor 'org.projectlombok:lombok:1.18.30'

三、IDEA 必须装插件!

否则 IDE 会报错!

  1. 打开 IDEA → File → Settings → Plugins
  2. 搜索 Lombok
  3. 安装 → 重启 IDEA

四、最常用注解(背会这 8 个就够)

1. @Data(最强万能注解)

自动生成:

  • getter / setter
  • toString
  • equals / hashCode
  • 无参构造
java 复制代码
@Data
public class User {
    private Long id;
    private String name;
}

2. @AllArgsConstructor

全参构造

java 复制代码
import lombok.AllArgsConstructor;

@AllArgsConstructor
public class User {
    private Long id;
    private String name;
}

等价:

java 复制代码
public User(Long id, String name) {
    this.id = id;
    this.name = name;
}

3. @NoArgsConstructor

无参构造

java 复制代码
import lombok.NoArgsConstructor;

@NoArgsConstructor
public class User {
    private Long id;
    private String name;
}

等价:

java 复制代码
public User() {
}

4. @ToString

toString 方法

java 复制代码
import lombok.ToString;

@ToString
public class User {
    private Long id;
    private String name;
}

等价于:

java 复制代码
public String toString() {
    return "User(id=" + id + ", name=" + name + ")";
}

5. @EqualsAndHashCode

equals 和 hashCode

java 复制代码
@Override
public boolean equals(Object o) {
    // 1. 同一内存地址 → 相等
    if (this == o) return true;
    
    // 2. 对象为null 或 类型不同 → 不相等
    if (o == null || getClass() != o.getClass()) return false;
    
    // 3. 强制转换成同类项
    User user = (User) o;
    
    // 4. 逐字段比较内容 → 全部相同才相等
    return Objects.equals(id, user.id) && Objects.equals(name, user.name);
}

@Override
public int hashCode() {
    // 根据所有字段生成哈希值
    return Objects.hash(id, name);
}
# 两个对象 equals 相等 → hashCode 必须相等;hashCode 相等 → equals 不一定相等
# equals 比较内容,== 比较地址

6. @Getter / @Setter

只生成 getter / setter

java 复制代码
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class User {
    private Long id;
    private String name;
}

等价于手动写:

java 复制代码
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }

7. @Slf4j

直接用 log 输出日志

java 复制代码
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class UserService {
    public void test() {
        log.info("用户信息查询成功");
        log.error("系统异常", e);
    }
}

等价于手动写:

java 复制代码
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UserService.class);

8. @Builder

建造者模式,优雅赋值

java 复制代码
User user = User.builder()
                .id(1)
                .name("张三")
                .build();

相关推荐
Pniubi7 小时前
HashMap的扩容和树化边界
java·开发语言
Mikko77 小时前
用 Java 复刻了高中时在塞班上玩的「熔岩矿车」:纯 Swing、零依赖、没有一张图片,一个 jar 双击就能玩
java·游戏开发·swing
知了学历孙老师7 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
Java爱好狂.7 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
秋饼8 小时前
LLM API密钥动态轮换实战:Spring Vault + Spring AI + 多Provider路由
java·ai·技术分享·后端开发
福兮说10 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
紧跟先前的步伐11 小时前
Go AI Agent 实战 03|Token、上下文窗口与模型调用成本
java·人工智能·golang
const_qiu11 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
Promising_GEO12 小时前
GEE实战02期:从卫星波段开始:利用 Sentinel-2 自己计算 NDVI
java·sentinel·遥感·空间分析