Java編碼輔助工具Lombok用法詳解
前言
在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常會(huì)涉及到一些調(diào)整很少但又必不可少的環(huán)節(jié),比如實(shí)體類(lèi)的Getter/Setter方法,ToString方法等。這時(shí)可以使用Lombok來(lái)避免這種重復(fù)的操作,減少非核心代碼的臃腫,提高編碼效率。
如何在IntelliJ IDEA中引入Lombok
安裝Lombok 插件(否則在調(diào)用setter/getter方法時(shí)IDE會(huì)提示報(bào)錯(cuò)): File -> Settings -> Plugins 搜索Lombok Plugin完成安裝。
pom.xml中引入lombok依賴(lài)(其中<scope>provided</scope>表示只在編譯、測(cè)試階段依賴(lài)該jar,運(yùn)行階段不依賴(lài)(如運(yùn)行容器中已包含了該jar,則置為provided避免jar沖突),默認(rèn)<scope>compile</scope>則表示在編譯、測(cè)試、運(yùn)行階段都依賴(lài)):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.20</version> <scope>provided</scope> </dependency>
Lombok注解用途
@Getter/@Setter
為字段生成Getter和Setter方法,可以注解到字段或者類(lèi)上(注解在類(lèi)上會(huì)為類(lèi)中所有字段生成Getter和Setter方法)。默認(rèn)是public類(lèi)型的,如果需要的話(huà)可以修改方法的訪問(wèn)級(jí)別: @Getter(AccessLevel.PROTECTED)
Lombok中的注解一般都會(huì)包含一個(gè)無(wú)參構(gòu)造函數(shù)注解@NoArgsConstructor(用于生成無(wú)參構(gòu)造函數(shù)) ,所以還會(huì)額外生成一個(gè)無(wú)參構(gòu)造函數(shù)
@NonNull
調(diào)用字段的setter方法時(shí),如果傳的參數(shù)為null,則會(huì)拋出空異常NullPointerException,生成setter方法時(shí)會(huì)檢查參數(shù)是否為空
@NoArgsConstructor
生成一個(gè)無(wú)參構(gòu)造方法。當(dāng)類(lèi)中有final字段沒(méi)有被初始化時(shí),編譯器會(huì)報(bào)錯(cuò),此時(shí)可用@NoArgsConstructor(force = true),然后就會(huì)為沒(méi)有初始化的final字段設(shè)置默認(rèn)值 0 / false / null, 這樣編譯器就不會(huì)報(bào)錯(cuò)。對(duì)于具有約束的字段(例如@NonNull字段),不會(huì)生成檢查或分配,因此請(qǐng)注意,正確初始化這些字段之前,這些約束無(wú)效。
@RequiredArgsConstructor
生成構(gòu)造方法(可能帶參數(shù)也可能不帶參數(shù)),如果帶參數(shù),這參數(shù)只能是以final修飾的未經(jīng)初始化的字段,或者是以@NonNull注解的未經(jīng)初始化的字段。
@RequiredArgsConstructor(staticName = “of”)會(huì)生成一個(gè)of()的靜態(tài)方法,并把構(gòu)造方法設(shè)置為私有的
@AllArgsConstructor
生成一個(gè)全參數(shù)的構(gòu)造方法
@ToString
生成toString()方法,默認(rèn)情況下它會(huì)按順序(以逗號(hào)分隔)打印你的類(lèi)名稱(chēng)以及每個(gè)字段。可以這樣設(shè)置不包含哪些字段,可以指定一個(gè)也可以指定多個(gè)@ToString(exclude = “id”) / @ToString(exclude = {“id”,”name”}) 。如果繼承的有父類(lèi)的話(huà),可以設(shè)置callSuper 讓其調(diào)用父類(lèi)的toString()方法,例如:@ToString(callSuper = true)
@EqualsAndHashCode
生成hashCode()和equals()方法,默認(rèn)情況下,它將使用所有非靜態(tài),非transient字段。但可以通過(guò)在可選的exclude參數(shù)中來(lái)排除更多字段?;蛘?,通過(guò)在of參數(shù)中命名它們來(lái)準(zhǔn)確指定希望使用哪些字段。
// exclude 排除字段 @EqualsAndHashCode(exclude = {“password”, “salt”}) // of 指定要包含的字段 @EqualsAndHashCode(of = {“id”, “phone”, “password”})
@Data
@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能
@Value
@Value 將字段都變成不可變類(lèi)型:使用final修飾, 同時(shí)還包含@ToString、@EqualsAndHashCode、
@AllArgsConstructor 、@Getter(注意只有Getter沒(méi)有Setter)
@Log
生成log對(duì)象,用于記錄日志,可以通過(guò)topic屬性來(lái)設(shè)置getLogger(String name)方法的參數(shù) 例如 @Log4j(topic = “com.xxx.service.xxx”),默認(rèn)是類(lèi)的全限定名,即 類(lèi)名.class,log支持以下幾種:
- @Log java.util.logging.Logger
- @Log4j org.apache.log4j.Logger
- @Log4j2 org.apache.logging.log4j.Logger
- @Slf4j org.slf4j.Logger
- @XSlf4j org.slf4j.ext.XLogger
- @CommonsLog org.apache.commons.logging.Log
- @JBossLog org.jboss.logging.Logger
@Log private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName()); @Log4j private static final Logger log = org.apache.log4j.Logger.Logger.getLogger(UserService.class); @Log4j2 private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class); @Slf4j private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class); @XSlf4j private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class); @CommonsLog private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class); @JBossLog private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
@SneakyThrows
使用try catch 修飾方法,來(lái)捕獲異常, 默認(rèn)捕獲的是Throwable異常,也可以設(shè)置要捕獲的異常:@SneakyThrows(InterruptedException.class)
@Synchronized
給方法加上同步鎖
@Cleanup
主要用來(lái)修飾 IO 流相關(guān)類(lèi), 會(huì)在 finally 代碼塊中對(duì)該資源進(jìn)行 close();
@Getter(lazy = true)
標(biāo)注字段為懶加載字段,懶加載字段在創(chuàng)建對(duì)象時(shí)不會(huì)進(jìn)行初始化,而是在第一次訪問(wèn)的時(shí)候才會(huì)初始化,后面再次訪問(wèn)也不會(huì)重復(fù)初始化
@Wither
提供了給final字段賦值的一種方法
@Builder
為你的類(lèi)生成復(fù)雜的構(gòu)建器API。
@Delegate
為L(zhǎng)ist類(lèi)型的字段生成一大堆常用的方法,其實(shí)這些方法都是List中的方法 。注意:一個(gè)類(lèi)中只能使用一個(gè)@Delegate注解,因?yàn)槭褂枚鄠€(gè)會(huì)生成多個(gè)size()方法,從而會(huì)編譯報(bào)錯(cuò)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb踩坑記錄之項(xiàng)目訪問(wèn)不到html文件
這篇文章主要給大家介紹了關(guān)于JavaWeb踩坑記錄之項(xiàng)目訪問(wèn)不到html文件的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaWeb具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03Springboot RestTemplate設(shè)置超時(shí)時(shí)間的方法(Spring boot
這篇文章主要介紹了Springboot RestTemplate設(shè)置超時(shí)時(shí)間的方法,包括Spring boot 版本<=1.3和Spring boot 版本>=1.4,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08Collections工具類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
Collections工具類(lèi)提供了大量針對(duì)Collection/Map的操作。這篇文章主要介紹了Collections工具類(lèi)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下2017-04-04maven無(wú)法依賴(lài)spring-cloud-stater-zipkin的解決方案
這篇文章主要介紹了maven無(wú)法依賴(lài)spring-cloud-stater-zipkin如何解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World程序
spring boot 是基于Spring的一個(gè)框架,Spring boot幫我們集成很多常用的功能,使得整個(gè)配置更加簡(jiǎn)單。這篇文章主要介紹了Spring Boot實(shí)戰(zhàn)之逐行釋義Hello World,需要的朋友可以參考下2017-12-12