Lombok常用注解及功能詳解

Lombok常用注解及功能詳解

    • 一、Lombok簡介與環境配置
      • 1.1 什么是Lombok?
      • 1.2 環境配置
        • 1.2.1 Maven項目
        • 1.2.2 Gradle項目
        • 1.2.3 IDE配置(關鍵)
    • 二、Lombok常用注解詳解
      • 2.1 @Data:一站式生成核心方法
      • 2.2 @Getter/@Setter:單獨生成getter/setter
      • 2.3 @ToString:生成toString()方法
      • 2.4 @NoArgsConstructor/@AllArgsConstructor:生成構造方法
      • 2.5 @RequiredArgsConstructor:生成必需字段的構造方法
      • 2.6 @NonNull:字段非空校驗
      • 2.7 @Slf4j:簡化日志對象創建
      • 2.8 @Builder:實現建造者模式
      • 2.9 @Value:生成不可變類
      • 2.10 @SneakyThrows:簡化異常處理
    • 三、Lombok注解組合使用場景
      • 3.1 實體類(POJO)
      • 3.2 服務類(Service)
      • 3.3 不可變DTO
    • 四、Lombok的優缺點與避坑指南
      • 4.1 優點
      • 4.2 缺點
      • 4.3 避坑指南
      • 總結

Java開發中,實體類的getter/setter、構造方法、toString()等模板代碼往往占據大量篇幅,不僅編寫繁瑣,還會降低代碼可讀性,Lombok通過注解機制自動生成這些模板代碼,讓我們能夠更專注于核心業務邏輯。

一、Lombok簡介與環境配置

1.1 什么是Lombok?

Lombok是一個Java庫,通過注解處理器在編譯期自動生成模板代碼(如gettersetter),無需手動編寫。它的核心優勢是:

  • 減少模板代碼,精簡類定義;
  • 避免修改字段后忘記更新getter/setter的問題;
  • 提高代碼可讀性,聚焦業務邏輯。

1.2 環境配置

1.2.1 Maven項目

pom.xml中添加依賴:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version><optional>true</optional> <!-- 避免傳遞依賴 -->
</dependency>
1.2.2 Gradle項目

build.gradle中添加:

implementation 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
1.2.3 IDE配置(關鍵)

Lombok通過編譯期生成代碼,IDE需安裝插件才能識別生成的方法(否則會報“方法不存在”錯誤):

  • IntelliJ IDEA
    1. 打開File → Settings → Plugins
    2. 搜索“Lombok”并安裝,重啟IDE;
    3. 開啟注解處理:Settings → Build, Execution, Deployment → Compiler → Annotation Processors → 勾選Enable annotation processing
  • Eclipse
    1. 安裝Lombok插件(官網下載lombok.jar,雙擊運行并指定Eclipse安裝目錄);
    2. 重啟Eclipse。

二、Lombok常用注解詳解

2.1 @Data:一站式生成核心方法

功能:自動生成gettersettertoString()equals()hashCode()方法,以及包含所有字段的構造方法。

使用示例

import lombok.Data;@Data
public class User {private Long id;private String username;private Integer age;
}

等價于手動編寫

public class User {private Long id;private String username;private Integer age;// getterpublic Long getId() { return id; }public String getUsername() { return username; }public Integer getAge() { return age; }// setterpublic void setId(Long id) { this.id = id; }public void setUsername(String username) { this.username = username; }public void setAge(Integer age) { this.age = age; }// toStringpublic String toString() { return "User(id=" + id + ", username=" + username + ", age=" + age + ")"; }// equals和hashCode(基于所有字段)public boolean equals(Object o) { /* 實現 */ }public int hashCode() { /* 實現 */ }// 全參構造方法public User(Long id, String username, Integer age) {this.id = id;this.username = username;this.age = age;}
}

注意

  • @Data不包含無參構造方法,若需要需額外添加@NoArgsConstructor
  • 適合POJO類(如實體類、DTO),不建議在復雜業務類中使用。

2.2 @Getter/@Setter:單獨生成getter/setter

功能:為類中所有字段(或指定字段)生成getter/setter方法。

使用示例

import lombok.Getter;
import lombok.Setter;@Getter // 為所有字段生成getter
@Setter // 為所有字段生成setter
public class Product {private Long id;private String name;@Getter(AccessLevel.PRIVATE) // 僅為price生成private getter@Setter(AccessLevel.PROTECTED) // 僅為price生成protected setterprivate Double price;
}

關鍵參數

  • AccessLevel:指定方法訪問權限(PUBLICPROTECTEDPACKAGEPRIVATE),默認PUBLIC

適用場景

  • 只需生成部分字段的getter/setter
  • 需要控制getter/setter的訪問權限。

2.3 @ToString:生成toString()方法

功能:生成包含類名和字段的toString()方法,可指定包含/排除字段。

使用示例

import lombok.ToString;@ToString(includeFieldNames = true, // 輸出字段名(默認true)exclude = "password", // 排除password字段of = {"username", "age"} // 僅包含指定字段(與exclude二選一)
)
public class User {private Long id;private String username;private Integer age;private String password;
}

生成的toString()

public String toString() {return "User(username=" + username + ", age=" + age + ")";
}

注意

  • excludeof不可同時使用;
  • 若繼承父類,可添加callSuper = true包含父類的toString()結果(默認false)。

2.4 @NoArgsConstructor/@AllArgsConstructor:生成構造方法

  • @NoArgsConstructor:生成無參構造方法;
  • @AllArgsConstructor:生成包含所有字段的構造方法。

使用示例

import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;@NoArgsConstructor
@AllArgsConstructor
public class Book {private String isbn;private String title;private String author;
}

生成的構造方法

// 無參構造
public Book() {}// 全參構造
public Book(String isbn, String title, String author) {this.isbn = isbn;this.title = title;this.author = author;
}

注意

  • 若類中已有構造方法,@NoArgsConstructor會覆蓋默認無參構造(若未顯式定義);
  • 配合@Data使用時,需顯式添加@NoArgsConstructor(因@Data不包含無參構造)。

2.5 @RequiredArgsConstructor:生成必需字段的構造方法

功能:為final或被@NonNull標注的字段生成構造方法。

使用示例

import lombok.RequiredArgsConstructor;
import lombok.NonNull;@RequiredArgsConstructor
public class Order {private final Long orderId; // final字段(必需)@NonNull private String productName; // @NonNull標注(必需)private Integer quantity; // 普通字段(非必需)
}

生成的構造方法

public Order(Long orderId, String productName) {this.orderId = orderId;if (productName == null) {throw new NullPointerException("productName is marked non-null but is null");}this.productName = productName;
}

適用場景

  • 依賴注入(如構造方法注入@Autowired);
  • 確保核心字段必須初始化。

2.6 @NonNull:字段非空校驗

功能:在構造方法或setter中為字段添加非空校驗,若為null則拋出NullPointerException

使用示例

import lombok.NonNull;
import lombok.Setter;public class User {private Long id;@NonNull private String username; // 非空校驗@Setter@NonNull private Integer age; // setter中添加非空校驗
}

生成的代碼

public class User {private Long id;private String username;private Integer age;public User(String username) {if (username == null) {throw new NullPointerException("username is marked non-null but is null");}this.username = username;}public void setAge(Integer age) {if (age == null) {throw new NullPointerException("age is marked non-null but is null");}this.age = age;}
}

注意@NonNull需配合構造方法或setter使用(如與@Data@Setter等注解一起用)。

2.7 @Slf4j:簡化日志對象創建

功能:自動生成日志對象(private static final Logger log = LoggerFactory.getLogger(類名.class);),支持主流日志框架(Logback、Log4j2等)。

使用示例

import lombok.extern.slf4j.Slf4j;@Slf4j // 生成log對象
public class OrderService {public void createOrder() {log.info("開始創建訂單"); // 直接使用log對象try {// 業務邏輯log.debug("訂單創建成功");} catch (Exception e) {log.error("訂單創建失敗", e); // 打印異常}}
}

等價于手動編寫

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class OrderService {private static final Logger log = LoggerFactory.getLogger(OrderService.class);public void createOrder() {log.info("開始創建訂單");// ...}
}

類似注解

  • @Log:對應java.util.logging.Logger
  • @Log4j:對應Log4j 1.x;
  • @Log4j2:對應Log4j 2.x。
  • 推薦使用@Slf4j(Slf4j是日志門面,可適配不同日志框架)。

2.8 @Builder:實現建造者模式

功能:為類生成建造者模式代碼,支持鏈式調用創建對象。

使用示例

import lombok.Builder;
import lombok.ToString;@Builder
@ToString
public class User {private Long id;private String username;private Integer age;
}

使用建造者創建對象

public class Test {public static void main(String[] args) {// 鏈式調用設置屬性User user = User.builder().id(1L).username("張三").age(20).build(); // 構建對象System.out.println(user); // 輸出:User(id=1, username=張三, age=20)}
}

優勢

  • 相比構造方法,無需記憶參數順序;
  • 支持選擇性設置字段(無需為可選字段創建多個構造方法)。

注意@Builder默認生成全參私有構造方法,若需公開構造方法,需配合@NoArgsConstructor@AllArgsConstructor

2.9 @Value:生成不可變類

功能:生成不可變類(類似@Data,但字段默認為final,且無setter)。

使用示例

import lombok.Value;@Value
public class ImmutableUser {Long id;String username;Integer age;
}

生成的代碼特點

  • 所有字段被final修飾(不可修改);
  • 生成getter,但無setter
  • 生成全參構造方法(必須初始化所有字段);
  • 生成toString()equals()hashCode()

適用場景

  • 存儲常量數據(如配置信息);
  • 線程安全的不可變對象。

2.10 @SneakyThrows:簡化異常處理

功能:自動捕獲受檢異常(Checked Exception)并包裝為運行時異常拋出,無需顯式try-catchthrows聲明。

使用示例

import lombok.SneakyThrows;
import java.io.FileInputStream;public class FileUtil {// 無需聲明throws IOException@SneakyThrowspublic static void readFile() {FileInputStream fis = new FileInputStream("test.txt");// ...}
}

生成的代碼

public class FileUtil {public static void readFile() {try {FileInputStream fis = new FileInputStream("test.txt");} catch (IOException e) {throw new RuntimeException(e); // 包裝為運行時異常}}
}

注意

  • 謹慎使用,可能隱藏異常類型(調用者無法通過throws聲明感知受檢異常);
  • 適合簡化工具類中的異常處理。

三、Lombok注解組合使用場景

3.1 實體類(POJO)

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import lombok.ToString;@Data // getter、setter、toString等
@NoArgsConstructor // 無參構造(JSON反序列化需要)
@AllArgsConstructor // 全參構造(測試用)
@ToString(exclude = "password") //  toString排除密碼
public class User {private Long id;private String username;@NonNull // 非空校驗private String password;private Integer age;
}

3.2 服務類(Service)

import lombok.extern.slf4j.Slf4j;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;@Service
@Slf4j // 日志
@RequiredArgsConstructor // 構造方法注入依賴
public class UserService {private final UserMapper userMapper; // final字段(構造方法注入)public User getUserById(Long id) {log.info("查詢用戶ID:{}", id);return userMapper.selectById(id);}
}

3.3 不可變DTO

import lombok.Value;
import lombok.Builder;@Value // 不可變類
@Builder // 支持建造者模式創建
public class UserDTO {Long id;String username;Integer age;
}

四、Lombok的優缺點與避坑指南

4.1 優點

  1. 減少模板代碼:省去大量gettersetter等重復代碼;
  2. 提高開發效率:新增字段時無需手動更新相關方法;
  3. 代碼更簡潔:聚焦核心業務邏輯,可讀性提升。

4.2 缺點

  1. 強依賴插件:IDE必須安裝Lombok插件,否則會報錯;
  2. 調試困難:生成的代碼在源碼中不可見,調試時需查看編譯后的class文件;
  3. 過度使用風險:濫用@Data可能導致類職責不清晰;
  4. 兼容性問題:某些框架(如序列化工具)可能無法識別生成的方法。

4.3 避坑指南

  1. 避免在父類使用@Data:子類繼承后可能導致equals()hashCode()邏輯錯誤;
  2. 謹慎使用@SneakyThrows:不要在業務核心邏輯中隱藏受檢異常,以免影響異常處理;
  3. 序列化注意:若類需要序列化(如實現Serializable),建議手動編寫serialVersionUID(Lombok不自動生成);
  4. 版本兼容:確保Lombok版本與JDK版本兼容(如JDK 17需Lombok 1.18.20+);
  5. 代碼審查:生成的代碼雖不可見,但需在審查時考慮其邏輯(如equals()是否符合預期)。

總結

核心推薦注解:

  • 實體類:@Data + @NoArgsConstructor + @AllArgsConstructor
  • 服務類:@Slf4j + @RequiredArgsConstructor
  • 不可變對象:@Value
  • 日志:@Slf4j

若這篇內容幫到你,動動手指支持下!關注不迷路,干貨持續輸出!
ヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノヾ(′? ˋ)ノ

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91434.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91434.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91434.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

應用分層

應用分層是?種軟件開發設計思想&#xff0c;它將應用程序分成N個層次&#xff0c;這N個層次分別負責各自的職責&#xff0c; 多個層次之間協同提供完整的功能。根據項目的復雜度&#xff0c;把項目分成三層&#xff0c;四層或者更多層。常見的MVC設計模式&#xff0c;就是應用…

[特殊字符] 【JAVA進階】StringBuilder全方位解析:從使用到源碼,一文搞定!

&#x1f525; 掌握StringBuilder&#xff0c;讓你的Java字符串操作性能飆升&#xff01;&#x1f9e9; StringBuilder是什么&#xff1f; StringBuilder是Java中用于動態構建字符串的可變字符序列類&#xff0c;位于java.lang包中。與不可變的String類不同&#xff0c;StringB…

Redis 數據結構全景解析

Redis 不是簡單的 key-value 緩存&#xff0c;它更像一把“瑞士軍刀”。 只要掌握數據結構&#xff0c;就能把同一份內存用出 10 倍效率。0. 開場白&#xff1a;為什么聊數據結構&#xff1f; 面試常問“Redis 有幾種數據類型&#xff1f;”——很多人答 5 種&#xff08;Strin…

ansible.cfg 配置文件的常見配置項及其說明

配置項說明默認值defaults默認配置部分inventory指定清單文件的位置&#xff0c;可以是文件路徑、目錄或動態清單腳本。/etc/ansible/hostsremote_user默認的遠程用戶roothost_key_checking是否啟用主機密鑰檢查。設置為 False 跳過 SSH 主機密鑰驗證。Trueask_pass是否在執行時…

Effective C++ 條款15:在資源管理類中提供對原始資源的訪問

Effective C 條款15&#xff1a;在資源管理類中提供對原始資源的訪問核心思想&#xff1a;RAII類需要提供訪問其封裝原始資源的顯式或隱式接口&#xff0c;以兼容需要直接操作資源的API&#xff0c;同時維持資源的安全管理。 ?? 1. 原始資源訪問的必要性 使用場景示例&#x…

Linux 進程管理與計劃任務設置

Linux 進程管理與計劃任務設置一、進程管理進程管理用于監控、控制系統中運行的程序&#xff08;進程&#xff09;&#xff0c;包括查看進程狀態、調整優先級、終止異常進程等。以下是核心命令及操作說明&#xff1a;1. 常用進程查看命令&#xff08;1&#xff09;ps&#xff1…

MYSQL數據庫之索引

1、引入索引的問題在圖書館查找一本書的過程&#xff0c;可類比數據庫查詢場景。在一般軟件系統中&#xff0c;對數據庫操作以查詢為主&#xff0c;數據量較大時&#xff0c;優化查詢是關鍵&#xff0c;索引便是優化查詢的重要手段 。2、索引是什么索引是一種特殊文件&#xff…

ArcGIS以及ArcGIS Pro如何去除在線地圖制作者名單

問題&#xff1a;ArcGIS和ArcGIS Pro提供了許多在線地圖服務&#xff0c;但是這些地圖會自動生成制作者名單&#xff0c;如下圖所示&#xff1a; 在線地圖加載方式可參考&#xff1a;如何在ArcGIS和ArcGIS Pro中添加在線底圖 這在出圖時有時會造成圖的部分信息遮擋或出圖不美觀…

InfluxDB 與 Golang 框架集成:Gin 實戰指南(二)

四、實際應用案例4.1 案例背景某智能工廠部署了大量的物聯網設備&#xff0c;如傳感器、智能儀表等&#xff0c;用于實時監測生產線上設備的運行狀態、環境參數&#xff08;如溫度、濕度&#xff09;以及生產過程中的各項指標&#xff08;如產量、次品率&#xff09;。這些設備…

Linux系統磁盤未分配的空間釋放并分配給 / 根目錄的詳細操作【openEuler系統】

選擇 Fix 修正 GPT 表 輸入 Fix 并按回車&#xff0c;parted 會自動&#xff1a; 擴展 GPT 表的 結束位置 到磁盤末尾。釋放未被使用的空間&#xff08;1048576000 個 512B 塊&#xff0c;約 500GB&#xff09;。 驗證修正結果 修正后&#xff0c;再次運行&#xff1a; parted …

王道考研-數據結構-01

數據結構-01視頻鏈接&#xff1a;https://www.bilibili.com/video/BV1b7411N798?spm_id_from333.788.videopod.sections&vd_source940d88d085dc79e5d2d1c6c13ec7caf7&p2 數據結構到底在學什么? 數據結構這門課他要學習的就是怎么用程序代碼把現實世界的問題給信息化&…

k8s云原生rook-ceph pvc快照與恢復(上)

#作者&#xff1a;Unstopabler 文章目錄前言部署rook-ceph on kubernets條件Ceph快照概述什么是PVC安裝快照控制器和CRD1.安裝crds資源2.安裝控制器3.安裝快照類前言 Rook 是一個開源的云原生存儲編排器&#xff0c;為各種存儲解決方案提供平臺、框架和支持&#xff0c;以便與…

springcloud04——網關gateway、熔斷器 sentinel

目錄 注冊中心 nacos | eurekaServer |zookeeper(dubbo) 配置中心 nacos | config Server 遠程服務調用 httpClient | RestTemplate | OpenFeign 負載均衡服務 ribbon | loadbalancer 網關 zuul | gateway 熔斷器 hystrix | sentinel 網關 sentinel 流控 壓測工具 1…

XSS跨站腳本攻擊詳解

一、XSS攻擊簡介跨站腳本攻擊的英文全稱是Cross-Site Scripting&#xff0c;為了與CSS有所區別&#xff0c;因此縮寫為“XSS”由于同源策略的存在&#xff0c;攻擊者或者惡意網站的JavaScript代碼沒有辦法直接獲取用戶在其它網站的信息&#xff0c;但是如果攻擊者有辦法把惡意的…

Linux /proc/目錄詳解

文章目錄前言文件說明注意事項前言 在 Linux 系統中&#xff0c;/proc 目錄是一個特殊的虛擬文件系統&#xff0c;它提供了對系統內核和進程的訪問。/proc 目錄中的文件和目錄不是真實存在的&#xff0c;它們是在運行時由內核動態生成的&#xff0c;用于提供系統和進程的相關信…

北斗變形監測在地質災害監測中的應用

內容概要 北斗形變監測系統在地質災害監測領域發揮著核心作用&#xff0c;該系統基于北斗衛星導航技術&#xff0c;實現對地表變形的精確追蹤。通過毫米級精度定位能力&#xff0c;北斗形變監測技術為滑坡等災害提供關鍵數據支撐&#xff0c;尤其在偏遠地區應用中&#xff0c;單…

2025新征程杯全國54校園足球錦標賽在北京世園公園隆重開幕

2025年8月1日&#xff0c;備受矚目的2025新征程杯全國54校園足球錦標賽&#xff08;北京&#xff09;在北京世園公園盛大拉開帷幕。開幕式上&#xff0c;中國關心下一代健康體育基金會副秘書長、中國青少年研究會理事、全國 54 校園足球人才培養計劃創始人何占強主任表示&#…

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測

分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測 目錄分類預測 | Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測分類效果基本介紹程序設計分類效果 基本介紹 1.Matlab實現CPO-PNN冠豪豬算法優化概率神經網絡多特征分類預測&#xff0c;運…

機器學習——邏輯回歸(LogisticRegression)的核心參數:以約會數據集為例

理解 LogisticRegression 的核心參數&#xff1a;以約會數據集為例 邏輯回歸&#xff08;Logistic Regression&#xff09;是機器學習中一種基礎且重要的分類算法&#xff0c;特別適用于解決二分類和多分類問題。本文將基于 sklearn.linear_model.LogisticRegression 的用法&a…

深入解析 Apache Flink FLIP-511:優化 Kafka Sink 事務處理,減輕 Broker 負載

一、 背景與核心問題&#xff1a;Kafka Sink 事務的痛點 Flink Kafka Sink 在 Exactly-Once 模式下依賴 Kafka 事務來確保數據寫入的原子性&#xff0c;并與 Flink 檢查點對齊。然而&#xff0c;非優雅關閉&#xff08;如任務失敗、非 stop-with-savepoint 的停止&#xff09;會…