龍目島中的@StandardException 註解
一、簡介
異常類在 Java 應用程序中對於正確捕獲和處理錯誤至關重要。花時間為異常編寫重複代碼而不是考慮應用程序的其他方面是很常見的。
在本教程中,我們將使用 Lombok 的@StandardException
註釋來自動生成異常類型類的構造函數。此外,我們還將了解它的優點和缺點。
2. 什麼是@StandardException?
@StandardException
是添加到Project Lombok版本v
1.18.22
的實驗性註釋。該註釋適用於Throwable
的任何子類並自動生成四個構造函數:
- 無參數構造函數
- 沒有原因的僅消息構造函數
- 沒有消息的僅原因構造函數
- 帶有消息和原因的規範構造函數
與大多數 Lombok 註釋一樣, @StandardException
非常簡單,我們將在以下部分中看到。
2.1.添加龍目島依賴
我們需要 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
,我們必須創建一個擴展Throwable
類或其任何子類的目標類.
因此,它適用於已檢查和未檢查的異常以及錯誤。
為了說明,讓我們創建一個CustomException
類:
@StandardException
public class CustomException extends Throwable {
}
代碼編譯正常,因為CustomException
擴展了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 註釋的工作方式與實現自定義異常構造函數的通常 Java 方法不同。通常,JDK 通過調用指定簽名的super
構造函數版本來實現它們。例如,cause-only 構造函數將在其實現中調用super(cause)
。
另一方面,Lombok 的前三個構造函數依賴於生成的規範構造函數來構建異常對象。規範構造函數調用super(message)
來構建初始對象。然後,它使用initCause()
方法初始化CustomException
的原因(如果它不是null
話) 。
這兩種實現有不同的細微差別,我們在使用註解時必須考慮這些細微差別。
在下一節中,我們將探討@StandardException
與通常方法相比的一些優點和缺點。
三、優點
使用@StandardException
的主要優點是我們避免編寫樣板代碼。例如,在原始 Java 中創建NumberFormatException
的子類可能如下所示:
public class CustomNumberFormatException extends NumberFormatException{
public CustomNumberFormatException() {
super();
}
public CustomNumberFormatException(String s) {
super(s);
}
}
在上面的代碼中,我們使用 NumberFormatException 的可用super
構造函數手動創建了構造函數NumberFormatException.
在實際應用程序中,該代碼經常跨異常類重複。因此,我們最終會多次復制和粘貼相同的代碼。當異常類的數量很多時,這會變得更難維護。
相反,通過使用@StandardException
,我們使用一行代碼獲得了四個自動生成的構造函數。因此,它**可能會提高開發速度並提高代碼的可維護性。**
@StandardException
的另一個好處是生成的構造函數僅使用super(message)
構造函數,它存在於大多數 Java 異常中。因此,我們避免調用超類中不存在的super
構造函數。例如, NumberFormatException
沒有定義規範的和 cause-only 構造函數。因此,調用super(message, cause)
或super(cause)
將在其子類中失敗。
最後,所有使用@StandardException
異常都與 Lombok 實現的行為相同。我們無法通過 Lombok 修改代碼,因為它是自動生成的。因此,我們不太可能將可能有問題的代碼引入帶有@StandardException
註釋的類。
4.缺點
使用代碼生成器的一個明顯缺點是引入了更多的調試複雜性。在編寫的代碼中調試和發現缺陷比在生成的代碼中更容易。因此,如果出現某些問題,使用@StandardException
可能會使調試會話複雜化。
另一個需要考慮的陷阱是在 Lombok 上創建的依賴項。如果我們想返回純 Java,將我們的代碼耦合到@StandardException
會產生額外的工作。此外,如果在 Lombok 端發生錯誤,將影響使用註解的所有異常。
5.結論
在這篇簡短的文章中,我們學習瞭如何使用在版本v
中添加到 Lombok 的@StandardException
.1.18.22.
與普通 Java 相比,我們還看到了它的一些優點和缺點。
關鍵是要權衡它的優缺點,而不是在我們的應用中亂用。
一如既往,源代碼可在 GitHub 上獲得。