從版本 7 開始,Java 提供了改進的資源管理,這些資源在使用後應關閉。此類資源包括檔案、串流、資料庫連線和套接字等。這個目的是透過一種特殊的語言結構 try-with-resources 來實現的。為了使這種自動關閉功能發揮作用,創建了一個特殊的介面
AutoCloseable
。 在 Java 7 中,所有資源類別都實作該介面。它的簽名如下圖所示:
public interface AutoCloseable {
void close() throws Exception;
}
此介面宣告了一個方法,close()
該方法會在建構所服務的物件上自動呼叫try-with-resources
。儘管 Java 7 中的資源類別實現了此接口,但您使用的許多庫卻沒有實現,因為該庫尚未更新為與 AutoCloseable 接口一起使用,或者您根本沒有機會更新該庫。在大多數情況下,這可以輕鬆解決。繼承應該參與的資源類別try-with-resources
。讓我們舉個例子ITextRenderer
(來自飛碟計畫)。完成工作後ITextRenderer
,應呼叫該方法finishPDF()
。通常您會在一個區塊中執行此操作finally
。但是,當您建立一個擴展ITextRenderer
並實作該介面的新類別時AutoCloseable
,您可以將其包含在try-with-resources
. 新類別AutoCloseableITextRenderer
將如下所示:
public class AutoCloseableITextRenderer extends ITextRenderer implements AutoCloseable {
@Override
public void close() {
super.finishPDF();
}
}
在後代中擴展原始類別是最合理的解決方案,因為新類別仍然是ITextRenderer
. 如果原始類別聲明為final
,則必須使用組合。這就是用法:
try (final AutoCloseableITextRenderer iTextRenderer = new AutoCloseableITextRenderer()) {
ByteArrayOutputStream out; // contains the data to be converted to PDF, not shown here.
iTextRenderer.setDocumentFromString(new String(out.toByteArray()));
iTextRenderer.layout();
iTextRenderer.createPDF(pdfOutputStream);
pdfOutputStream.flush();
}
就這樣。請注意,我沒有close()
從AutoCloseableITextRenderer
. 介面的JavadocAutoCloseable
對此有如下說明:雖然介面方法被宣告為拋出異常Exception
,但強烈建議該方法的實作者在實作該方法時使用更具體的異常類,或者如果該方法不能拋出異常,則根本不拋出close()
異常失敗。
GO TO FULL VERSION