@Cleanup
自動資源管理:安全地呼叫您的 close()
方法,無需煩惱。
總覽
您可以使用 @Cleanup
來確保指定的資源在程式碼執行路徑離開目前的作用域之前自動清除。 您可以透過使用 @Cleanup
註解任何區域變數宣告來做到這一點,如下所示
@Cleanup InputStream in = new FileInputStream("some/file");
如此一來,在您目前作用域的結尾,將會呼叫 in.close()
。 此呼叫保證會透過 try/finally 結構執行。 請查看下面的範例,瞭解其運作方式。
如果您想要清除的物件類型沒有 close()
方法,但有其他無參數方法,您可以指定此方法的名稱,如下所示
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
預設情況下,清除方法假定為 close()
。 無法透過 @Cleanup
呼叫帶有 1 個或多個參數的清除方法。
使用 Lombok
import lombok.Cleanup;
|
原生 Java
import java.io.*;
|
支援的配置鍵
-
lombok.cleanup.flagUsage
= [warning
|error
] (預設值:未設定) 如果設定,Lombok 將會把任何
@Cleanup
的使用標記為警告或錯誤。小字聲明
在 finally 區塊中,僅當給定的資源不是 null
時,才會呼叫清除方法。 但是,如果您在程式碼上使用 delombok
,則會插入對 lombok.Lombok.preventNullAnalysis(Object o)
的呼叫,以防止靜態程式碼分析可以確定不需要 null 檢查時發出警告。 在類別路徑上使用 lombok.jar
進行編譯會移除該方法呼叫,因此沒有執行階段相依性。
如果您的程式碼拋出例外,且隨後觸發的清除方法呼叫也拋出例外,則原始例外會被清除呼叫拋出的例外隱藏。 您不應依賴此「功能」。 理想情況下,lombok 希望產生程式碼,以便在主要程式碼區塊拋出例外時,close
呼叫拋出的任何例外都會被靜默吞噬(但如果主要程式碼區塊以任何其他方式退出,則 close
呼叫的例外將不會被吞噬)。 lombok 的作者目前不知道實作此方案的可行方法,但如果 java 更新允許,或者我們找到方法,我們將會修正它。
您仍然需要處理清除方法可能產生的任何例外!