Lombok 的@StandardException注解解析
1. 引言
在 Java 應(yīng)用程序中,異常類對于正確捕獲和處理錯誤至關(guān)重要。我們常常在編寫異常處理的重復(fù)代碼上花費(fèi)時間,而不是關(guān)注應(yīng)用程序的其他方面。
在本教程中,我們將使用 Lombok 的 @StandardException 注解自動生成異常類型類的構(gòu)造函數(shù)。此外,我們還將了解其優(yōu)缺點(diǎn)。
2. 什么是 @StandardException?
@StandardException 是一個實(shí)驗(yàn)性的注解,添加到 Project Lombok 的 v__1.18.22 版本中。該注解適用于任何 Throwable 的子類,并自動生成四個構(gòu)造函數(shù):
- 一個無參數(shù)構(gòu)造函數(shù)
- 一個僅帶消息的構(gòu)造函數(shù),無異常原因
- 一個僅帶異常原因的構(gòu)造函數(shù),無消息
- 一個帶有消息和異常原因的標(biāo)準(zhǔn)構(gòu)造函數(shù)
與大多數(shù) Lombok 注解一樣,@StandardException 非常簡單,我們將在以下部分看到。
2.1. 添加 Lombok 依賴
我們需要使用 Project Lombok 的 v.1.18.22 或更高版本來使用該注解。因此,讓我們將最新的 lombok::1.18.26 添加到我們的 pom.xml 文件中:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.26</version> <scope>provided</scope> </dependency>
2.2. 使用類注解
要在我們的異常中使用 @StandardException,我們必須創(chuàng)建一個擴(kuò)展 Throwable 類或其任何子類的目標(biāo)類。因此,它適用于檢查和未檢查異常以及錯誤。
為了說明,讓我們創(chuàng)建一個 CustomException 類:
@StandardException public class CustomException extends Throwable { }
由于 CustomException 擴(kuò)展了 Throwable,代碼正常編譯。讓我們看看編譯后生成的代碼:
public class CustomException extends Throwable { public CustomException() { this((String)null, (Throwable)null); } public CustomException(String message) { this(message, (Throwable)null); } public CustomException(Throwable cause) { this(cause != null ? cause.getMessage() : null, cause); } public CustomException(String message, Throwable cause) { super(message); if (cause != null) { super.initCause(cause); } } }
Lombok 注解的工作方式與實(shí)現(xiàn)自定義異常構(gòu)造函數(shù)的通常 Java 方法不同。通常,JDK 通過調(diào)用指定簽名的 super 構(gòu)造函數(shù)版本來實(shí)現(xiàn)它們。例如,僅包含異常原因的構(gòu)造函數(shù)在其實(shí)現(xiàn)中將調(diào)用 super(cause)。
另一方面,Lombok 的前三個構(gòu)造函數(shù)依賴于生成的標(biāo)準(zhǔn)構(gòu)造函數(shù)來構(gòu)建異常對象。標(biāo)準(zhǔn)構(gòu)造函數(shù)調(diào)用 super(message) 來構(gòu)建初始對象。然后,如果不是 null,它使用 initCause() 方法初始化 CustomException 的原因。
在使用注解時,我們必須考慮這兩種實(shí)現(xiàn)的不同細(xì)微差別。
接下來,我們將在下一部分中討論與通常方法相比,@StandardException 的一些優(yōu)點(diǎn)和缺點(diǎn)。
3. 優(yōu)點(diǎn)
使用 @StandardException 的主要優(yōu)點(diǎn)是我們避免了編寫樣板代碼。例如,在純 Java 中創(chuàng)建一個 NumberFormatException 的子類可能是這樣的:
public class CustomNumberFormatException extends NumberFormatException{ public CustomNumberFormatException() { super(); } public CustomNumberFormatException(String s) { super(s); } }
在上面的代碼中,我們手動使用 NumberFormatException 的可用 super 構(gòu)造函數(shù)創(chuàng)建了構(gòu)造函數(shù)。
在實(shí)際應(yīng)用程序中,該代碼通常會在異常類之間重復(fù)。因此,我們最終多次復(fù)制粘貼相同的代碼。當(dāng)異常類數(shù)量較多時,這會更難維護(hù)。
相比之下,**通過使用 @StandardException,我們可以通過一行代碼獲得四個自動生成的構(gòu)造函數(shù)。**因此,它可能會提高開發(fā)速度并改善代碼可維護(hù)性。
關(guān)于 @StandardException 的另一個好點(diǎn)是,生成的構(gòu)造函數(shù)僅使用 super(message) 構(gòu)造函數(shù),這在大多數(shù) Java 異常中都存在。因此,我們避免了調(diào)用在父類中不存在的 super 構(gòu)造函數(shù)。例如,NumberFormatException 沒有定義標(biāo)準(zhǔn)和僅異常原因構(gòu)造函數(shù)。因此,在其子類中調(diào)用 super(message, cause) 或 super(cause) 將失敗。
最后,所有使用 @StandardException 的異常都具有 Lombok 實(shí)現(xiàn)的相同行為。由于 Lombok 自動生成代碼,我們無法修改它。因此,我們不太可能向使用 @StandardException 注解的類中引入潛在的問題代碼。
4. 缺點(diǎn)
使用代碼生成器的一個明顯缺點(diǎn)是增加了調(diào)試的復(fù)雜性。在編寫的代碼中調(diào)試和發(fā)現(xiàn)缺陷比在生成的代碼中更容易。因此,如果某些內(nèi)容運(yùn)行不正確,使用 @StandardException 可能會使調(diào)試會話變得復(fù)雜。
另一個需要考慮的陷阱是對 Lombok 的依賴。將我們的代碼與 @StandardException 耦合會增加返回純Java 時的工作量。此外,如果 Lombok 方面出現(xiàn)問題,將影響所有使用該注解的異常。
5. 結(jié)論
在這篇簡短的文章中,我們學(xué)習(xí)了如何使用添加到 Lombok 版本 v.1.18.22 的 @StandardException。我們還了解了與純 Java 代碼手動實(shí)現(xiàn)相比的一些優(yōu)缺點(diǎn)。
關(guān)鍵是在我們的應(yīng)用程序中平衡其優(yōu)點(diǎn)和缺點(diǎn),而不是濫用它。
與往常一樣,源代碼可以在 GitHub 上找到。
到此這篇關(guān)于Lombok 的@StandardException注解介紹的文章就介紹到這了,更多相關(guān)Lombok @StandardException注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot實(shí)現(xiàn)maven多模塊和打包部署
本文主要介紹了springboot實(shí)現(xiàn)maven多模塊和打包部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04java線性表的存儲結(jié)構(gòu)及其代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記第一篇,線性表的存儲結(jié)構(gòu)及其代碼實(shí)現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09Java 反射機(jī)制知識詳細(xì)介紹及總結(jié)
反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機(jī)制2017-01-01Springboot2.x結(jié)合Mabatis3.x下Hikari連接數(shù)據(jù)庫報(bào)超時錯誤
本文針對Springboot2.x與Mybatis3.x結(jié)合使用時,Hikari連接數(shù)據(jù)庫出現(xiàn)超時錯誤的問題進(jìn)行了深入分析,并提供了一系列有效的解決方法,感興趣的可以了解一下2023-11-11Apache DolphinScheduler完全設(shè)置東八區(qū)時區(qū)
這篇文章主要為大家介紹了Apache DolphinScheduler完全設(shè)置東八區(qū)配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11Java中關(guān)于Null的9個解釋(Java Null詳解)
這篇文章主要介紹了Java中關(guān)于Null的9個解釋(Java Null詳解),本文詳細(xì)講解了Java中Null的9個相關(guān)知識,需要的朋友可以參考下2015-01-01