java中Lombok的實(shí)現(xiàn)示例
Lombok 的核心思想是:通過(guò)注解來(lái)消除 Java 中的冗長(zhǎng)代碼,讓代碼更加簡(jiǎn)潔、清晰和易于維護(hù)。
它通過(guò)在編譯時(shí)自動(dòng)生成這些代碼的字節(jié)碼(比如 getter、setter、構(gòu)造函數(shù)等),讓你在源代碼中無(wú)需手動(dòng)編寫(xiě)它們。
它解決了什么問(wèn)題?
在標(biāo)準(zhǔn)的 Java 開(kāi)發(fā)中,我們經(jīng)常需要為類的屬性編寫(xiě)大量重復(fù)、模板化的代碼,例如:
- Getter 和 Setter 方法:為每個(gè)私有字段生成
getXxx()和setXxx()方法。 - 構(gòu)造函數(shù):無(wú)參構(gòu)造、全參構(gòu)造等。
equals()、hashCode()和toString()方法。- 日志記錄器:每次都要聲明
private static final Logger log = ...。
這些代碼本身沒(méi)有業(yè)務(wù)邏輯,但又必須存在,導(dǎo)致:
- 源代碼冗長(zhǎng):一個(gè)簡(jiǎn)單的 POJO 類可能就有上百行代碼。
- 不易維護(hù):如果增加或修改一個(gè)字段,你需要手動(dòng)修改對(duì)應(yīng)的 getter、setter、
equals、hashCode、toString等方法,很容易出錯(cuò)。
Lombok 是如何工作的?
Lombok 是一個(gè) Java 編譯時(shí)注解處理器。它的工作流程如下:
- 你編寫(xiě)代碼:在 Java 類上使用 Lombok 注解(如
@Data)。 - 編譯器調(diào)用 Lombok:當(dāng)你使用
javac(或 IDE 內(nèi)置的編譯功能)編譯代碼時(shí),編譯器會(huì)檢測(cè)到 Lombok 注解。 - Lombok 修改 AST:Lombok 會(huì)介入編譯過(guò)程,修改 Java 編譯器的抽象語(yǔ)法樹(shù)(AST) ,將注解對(duì)應(yīng)的代碼(如 getter 方法)的字節(jié)碼“注入”到正在編譯的類中。
- 生成最終的
.class文件:最終生成的.class文件就包含了這些自動(dòng)生成的方法,就好像是你自己親手寫(xiě)的一樣。
關(guān)鍵點(diǎn):Lombok 修改的是 .class 文件,而不是你的 .java 源文件。所以你的源代碼看起來(lái)非常干凈,但編譯后的類卻擁有所有完整的方法。
常用注解示例
讓我們通過(guò)一個(gè)例子來(lái)直觀感受 Lombok 的強(qiáng)大。
沒(méi)有 Lombok 的代碼:
public class User {
private Long id;
private String name;
private Integer age;
public User() {
}
public User(Long id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
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;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
// ... 冗長(zhǎng)且容易出錯(cuò)的 equals 實(shí)現(xiàn) ...
}
@Override
public int hashCode() {
// ... 冗長(zhǎng)且容易出錯(cuò)的 hashCode 實(shí)現(xiàn) ...
}
@Override
public String toString() {
// ... toString 實(shí)現(xiàn) ...
}
}
使用 Lombok 后的代碼:
import lombok.Data;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@Data // 生成所有字段的getter、setter、equals、hashCode、toString方法
@NoArgsConstructor // 生成無(wú)參構(gòu)造函數(shù)
@AllArgsConstructor // 生成全參構(gòu)造函數(shù)
public class User {
private Long id;
private String name;
private Integer age;
}
看到了嗎?只需要 4 行注解,就替代了上面近 60 行的代碼! 代碼變得極其簡(jiǎn)潔,可讀性大大增強(qiáng)。
常用 Lombok 注解列表
| 注解 | 作用 |
|---|---|
| @Getter / @Setter | 為所有字段或特定字段生成 getter/setter。 |
| @ToString | 生成 toString() 方法。 |
| @EqualsAndHashCode | 生成 equals() 和 hashCode() 方法。 |
| @NoArgsConstructor | 生成無(wú)參構(gòu)造函數(shù)。 |
| @AllArgsConstructor | 生成全參構(gòu)造函數(shù)。 |
| @RequiredArgsConstructor | 為 final 字段和標(biāo)記了 @NonNull 的字段生成構(gòu)造函數(shù)。 |
| @Data | 最常用,是 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor 的合集。 |
| @Builder | 提供一種優(yōu)雅的建造者模式來(lái)創(chuàng)建對(duì)象。 |
| @Slf4j | 自動(dòng)注入一個(gè)日志記錄器 log(也可以是 @Log4j, @Log 等)。 |
| @val | 用于聲明局部變量,類型會(huì)自動(dòng)推斷(類似于 final var)。 |
| @NonNull | 標(biāo)注在參數(shù)或字段上,自動(dòng)生成空值檢查。 |
如何使用 Lombok?
添加依賴:在項(xiàng)目的構(gòu)建工具中加入 Lombok 依賴。
- Maven:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <!-- 使用最新版本 --> <scope>provided</scope> </dependency>- Gradle:
- 安裝 IDE 插件:由于 Lombok 在編譯時(shí)修改字節(jié)碼,你的 IDE(如 IntelliJ IDEA, Eclipse)需要安裝對(duì)應(yīng)的 Lombok 插件,才能正確識(shí)別和提示這些自動(dòng)生成的方法?,F(xiàn)在 IntelliJ IDEA 通常已內(nèi)置支持。
compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.30'
到此這篇關(guān)于java中Lombok的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java Lombok內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringTask快速入門(mén)最佳實(shí)踐記錄
Spring Task是Spring框架自帶的任務(wù)調(diào)度工具,基于JDK 的ScheduledExecutorService實(shí)現(xiàn),提供了注解驅(qū)動(dòng)的定時(shí)任務(wù)配置方式,今天這篇文章,我們就來(lái)全面學(xué)習(xí)Spring Task的使用方法和進(jìn)階技巧,感興趣的朋友一起看看吧2025-08-08
Spring如何通過(guò)@Lazy注解解決構(gòu)造方法循環(huán)依賴問(wèn)題
循環(huán)依賴其實(shí)就是循環(huán)引用,也就是兩個(gè)或則兩個(gè)以上的bean互相持有對(duì)方,最終形成閉環(huán),這篇文章主要給大家介紹了關(guān)于Spring如何通過(guò)@Lazy注解解決構(gòu)造方法循環(huán)依賴問(wèn)題的相關(guān)資料,需要的朋友可以參考下2023-03-03
基于Java實(shí)現(xiàn)修改圖片分辨率示例代碼
這篇文章主要介紹了一個(gè)可以修改圖片分辨率的java工具類,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)JAVA有一定的幫助,感興趣的小伙伴快來(lái)跟隨小編一起學(xué)習(xí)吧2021-12-12
Session和JWT的區(qū)別是什么以及與Cookie相比詳解
Web應(yīng)用需客戶端存儲(chǔ)用戶信息,Cookie是早期方案,有特點(diǎn)及驗(yàn)證方式,下面這篇文章主要介紹了Session和JWT的區(qū)別是什么以及與Cookie相比的相關(guān)資料,文中通過(guò)代碼就介紹的非常詳細(xì),需要的朋友可以參考下2026-04-04
Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法
這篇文章主要介紹了Java針對(duì)ArrayList自定義排序的2種實(shí)現(xiàn)方法,結(jié)合實(shí)例形式總結(jié)分析了Java操作ArrayList自定義排序的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01

