Lombok 是一个 Java 库,通过注解自动生成常用的样板代码(如 getter/setter、构造函数、日志声明等),显著减少代码量,同时提高代码整洁度。

一、配置方法

(1)IDE:需安装 Lombok 插件(IntelliJ IDEA/Eclipse)

(2)构建工具:Maven/Gradle 添加依赖,如下:

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<scope>provided</scope>
</dependency>

二、技术原理

Lombok 在编译期间通过注解处理器(Annotation Processor)修改抽象语法树(AST),直接生成字节码,因此不会影响运行时性能。

三、优缺点

1. 优点

(1)减少样板代码,提升可读性。

2. 缺点

(1)隐藏了实际代码,可能增加调试难度

(2)需团队统一规范,避免滥用

四、功能介绍

1. 简化 POJO 类代码

(1)@Getter / @Setter

作用:自动生成字段的 getter/setter 方法。

示例:

@Getter
@Setter
public class Student { } @Getter
@Setter
private String name;

扩展:可通过 AccessLevel 指定访问级别(如 @Getter(AccessLevel.PROTECTED))。

(2) @ToString

作用:生成 toString() 方法,包含所有字段或指定字段。

示例:

@ToString(exclude = "password")
public class User { ... }

(3)@EqualsAndHashCode

作用:生成 equals()hashCode() 方法,默认使用所有非静态字段。

示例:

@EqualsAndHashCode(callSuper = true) // 包含父类字段

(4)@NoArgsConstructor

生成无参构造方法,force 参数可强制初始化 final 字段为 0/false/null。

(5)RequiredArgsConstructor

为 final 字段和@NonNull 字段生成构造方法,适合依赖注入场景。

(6)@AllArgsConstructor

生成全参构造方法,按字段声明顺序排列参数。

(7)@Data

作用:组合注解,包含 @Getter@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor

适用场景:POJO 类简化。

(8)@Value

作用:生成不可变类(所有字段为 final),组合 @Getter@ToString@EqualsAndHashCode 等。

示例:

@Value
public class Point {
int x;
int y;
}

(9)@With

作用:生成不可变对象的副本并修改指定字段(类似 Kotlin 的 copy)。

示例:

@With
@AllArgsConstructor
public class User {
private String name;
}
User user = new User("Alice").withName("Bob");

2. 简化逻辑代码

(1)@Builder

作用:提供建造者模式 API。

示例:

@Builder
public class User {
private String name;
private int age;
}
// 使用
User user = User.builder().name("Alice").age(25).build();

注意:@Builder 会生成一个私有的全参构造函数,导致无法实例化对象。

(2) @SneakyThrows

作用:偷偷抛出受检异常,无需显式声明 throws

示例:

@SneakyThrows(IOException.class)
public void readFile() {
Files.readAllBytes(Paths.get("file.txt"));
}

(3) @Cleanup

作用:自动调用资源的 close() 方法(如 IO 流)。

示例:

@Cleanup InputStream in = new FileInputStream("file.txt");

3. 扩展变量类型

(1) val

标识变量为 final 局部变量。

(2) var

用于局部变量类型推断。类似于 Java 10+ 的 var,所以JDK 10 以上不建议使用。

4. 日志注解

(1)注解与对应框架

注解 对应的日志框架 依赖示例(Maven)
@Log java.util.logging (JUL) 内置(无需额外依赖)
@Log4j Apache Log4j 1.x log4j:log4j:1.2.17
@Log4j2 Apache Log4j 2.x org.apache.logging.log4j:log4j-core:2.x
@Slf4j SLF4J(需绑定具体实现,如 Logback) org.slf4j:slf4j-api:1.7.x
@XSlf4j SLF4J 扩展(支持 MDC、标记等) @Slf4j
@CommonsLog Apache Commons Logging commons-logging:commons-logging:1.2
@Flogger Google Flogger com.google.flogger:flogger:0.7.x
@JBossLog JBoss Logging org.jboss.logging:jboss-logging:3.4.x

(2)自定义日志变量名

通过 topic 参数修改日志实例名称。

示例代码:

@Slf4j(topic = "AuditLogger")
public class Service {
public void run() {
log.info("Audit event"); // 使用名为 AuditLogger 的日志实例
}
}

(3)日志级别支持

自动生成 trace()debug()info()warn()error() 等方法。

(4)@XSlf4j 的 MDC 支持

结合 SLF4J 的 Mapped Diagnostic Context(MDC)实现日志上下文跟踪。

示例代码:

@XSlf4j
public class OrderService {
public void processOrder(String orderId) {
MDC.put("orderId", orderId);
log.info("Processing order"); // 日志中自动包含 orderId
MDC.clear();
}
}

(5)@Flogger 的性能优化

Google Flogger 专为高性能日志设计,支持延迟参数计算。

示例代码:

@Flogger
public class NetworkService {
public void sendRequest() {
log.atInfo().log("Request sent to %s", getRemoteHost()); // 仅当日志级别为 INFO 时计算参数
}
}

5. 锁相关注解

(1)@Synchronized

实现 synchronized 同步块。

用法:

import lombok.Synchronized;

public class SynchronizedExample {
private final Object readLock = new Object(); @Synchronized
public static void hello() {
System.out.println("world");
} @Synchronized
public int answerToLife() {
return 42;
} @Synchronized("readLock")
public void foo() {
System.out.println("bar");
}
}

实际运行代码:

public class SynchronizedExample {
private static final Object $LOCK = new Object[0];
private final Object $lock = new Object[0];
private final Object readLock = new Object(); public static void hello() {
synchronized($LOCK) {
System.out.println("world");
}
} public int answerToLife() {
synchronized($lock) {
return 42;
}
} public void foo() {
synchronized(readLock) {
System.out.println("bar");
}
}
}

(2)@Locked

实现 ReentrantReadWriteLock 和 ReentrantLock 锁。

用法:

import lombok.Locked;

public class LockedExample {
private int value = 0; @Locked.Read
public int getValue() {
return value;
} @Locked.Write
public void setValue(int newValue) {
value = newValue;
} @Locked("baseLock")
public void foo() {
System.out.println("bar");
}
}

实际运行代码:

public class LockedExample {
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock baseLock = new ReentrantLock();
private int value = 0; public int getValue() {
this.lock.readLock().lock();
try {
return value;
} finally {
this.lock.readLock().unlock();
}
} public void setValue(int newValue) {
this.lock.writeLock().lock();
try {
value = newValue;
} finally {
this.lock.writeLock().unlock();
}
} public void foo() {
this.baseLock.lock();
try {
System.out.println("bar");
} finally {
this.baseLock.unlock();
}
}
}

五、使用注意事项

1. 谨慎使用@Data,可能生成不必要的方法影响性能

@Data 注解会默认生成以下方法:toString()、equals()、hashCode()、getter/setter 方法、无参构造器,在大型项目中,自动生成这些方法可能会导致:性能损耗(如频繁调用

hashCode())、代码可读性下降、潜在的循环引用等问题。

2. 部分注解不适用于继承场景需特殊处理

部分注解在继承场景下需要特殊处理:

(1)@Builder 注解在父类使用时,子类需要手动实现构建器

(2)@AllArgsConstructor 不会包含父类的字段

(3)@Value 注解会使类变为 final,影响继承

六、总结建议

从实际使用情况看,Lombok 既能简化通用代码,又能使代码更简洁,未遇过明显问题,可推广应用。

七、参考文档

(1)lombok features

Lombok 类库使用详解的更多相关文章

  1. Lombok之使用详解

    前言 在Java中,封装是一个非常好的机制,最常见的封装莫过于get,set方法了,无论是Intellij idea 还是Eclipse,都提供了快速生成get,set方法的快捷键,使用起来很是方便, ...

  2. IDEA2017.3.4破解方式及lombok图文配置详解

    下载jetbrainsCrack-2.7-release-str.jar包 下载地址: https://files.cnblogs.com/files/xifenglou/JetBrains.zip ...

  3. 一篇关于apache commons类库的详解

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  4. Intellij IDEA 安装lombok及使用详解

    项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set.toString.equals和hashCode方法,虽然eclipse和idea开发环境下都有自动生成的快捷方式,但 ...

  5. 一篇关于apache commons类库的详解[转]

    1.1. 开篇 在Java的世界,有很多(成千上万)开源的框架,有成功的,也有不那么成功的,有声名显赫的,也有默默无闻的.在我看来,成功而默默无闻的那些框架值得我们格外的尊敬和关注,Jakarta C ...

  6. 34.Intellij IDEA 安装lombok及使用详解

    转自:https://blog.csdn.net/qinxuefly/article/details/79159018 项目中经常使用bean,entity等类,绝大部分数据类类中都需要get.set ...

  7. C++类库开发详解(转)

    前言:这是一篇总结性的文章,需要有一点C++和dll基本知识的基础,在网上查阅了很多资料感觉没有一篇详细.具体.全面的dll开发介绍,我这是根据最近项目和网上资料整理出来的,并附带实例的一个总结性的文 ...

  8. Lombok的使用详解与插件安装

    JAVA面向对象编程中的封闭性和安全性.封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问.这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性 ...

  9. Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题

    原文:https://blog.csdn.net/f641385712/article/details/82081900 前言 Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一 ...

  10. lombok+slf4j+logback SLF4J和Logback日志框架详解

    maven 包依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lomb ...

随机推荐

  1. 基于标签值分布的强化学习推荐算法(Reinforcement Learning Recommendation Algorithm Based on Label Value Distribution)

    前言 看论文的第三天,坚持下去. 慢慢来,比较快. -- 唐迟 本文基于2023年6月28日发表在MATHEMATICS上的一篇名为"基于标签值分布的强化学习推荐算法"(Reinf ...

  2. day1-简介与下载

    为什么创造了golang? 计算机硬件技术更新频繁,不能合理运用多核多CPU的的优势 目前市场缺乏一款简洁高效的编程语言 c++.c运行速度很快,但存在内存泄漏的问题 go语言特点 既做到了静态语言的 ...

  3. Elasticsearch搜索引擎学习笔记(一)

    核心概念 ES -> 数据库 索引index -> 表 文档 document -> 行(记录) 字段 fields -> 列 安装Elasticsearch 1. 上传后解压 ...

  4. C/C++显示类型转换的位拓展方式

    最近用verilator写模块的tb,在这里卡了好久(测半天都是C++写的问题) 要点 变量从小位宽到大位宽显示类型转换(explicit cast)时的位拓展方式,取决于转换前变量的符号性. 倘若转 ...

  5. 【抓包】Fidder Script自动修改包

    Fiddler Script的本质是用JScript.NET编写的一个脚本文件CustomRules.js 但是它的语法很像C#但又有些不一样,比如不能使用@符号 通过修改CustomRules.js ...

  6. Docker镜像(image)详解

    如果曾经做过 VM 管理员,则可以把 Docker 镜像理解为 VM 模板,VM 模板就像停止运行的 VM,而 Docker 镜像就像停止运行的容器:而作为一名研发人员,则可以将镜像理解为类(Clas ...

  7. macos设置docker可以ping容器

    macos设置docker可以ping容器 项目连接不上seata 今天在启动项目时候seata报错: io.seata.common.exception.FrameworkException: ca ...

  8. React Props指南:从基础到高阶应用的最佳实践解析

    在 React 中,Props(属性)是组件间通信和数据传递的核心机制.通过合理使用 Props,开发者可以构建动态.可复用且易于维护的组件体系.本文将深入探讨 Props 的核心概念.使用方法及最佳 ...

  9. 【Docker】DockerFile解析

    DockerFile解析 中文官网 英文官网 是什么 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 构建三步骤 注意:Dockerfile可以构建出镜像, ...

  10. ASP.NET 简单实现数字时钟

    每隔1000毫秒(1s)获取一次当前时间 <asp:ScriptManager ID="ScriptManager_Time" runat="server" ...