JavaRush /Java Blog /Random-TW /Java 7 嘗試資源
DarthVictor
等級 28

Java 7 嘗試資源

在 Random-TW 群組發布
從版本 7 開始,Java 提供了改進的資源管理,這些資源在使用後應關閉。此類資源包括檔案、串流、資料庫連線和套接字等。這個目的是透過一種特殊的語言結構 try-with-resources 來實現的。為了使這種自動關閉功能發揮作用,創建了一個特殊的介面AutoCloseableJava 7 嘗試資源 - 1在 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()異常失敗。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION