簡體   English   中英

返回一個封閉的迭代

[英]returning a closeable iterable

假設我有一個懶惰的可迭代實例,需要關閉該實例才能釋放資源。 如果我從方法中返回此結果並在finally塊中將其關閉,那么在客戶端使用它之前或之后,將調用finally塊嗎?

例如:

public CloseableIterable<T> getStuff() {
    CloseableIterable<T> iterable = fetchStuffFromSomewhere();
    try {
        return iterable;
    } finally {
        iterable.close();
    }
}

注意:這里是Java 6,但我也對Java 7中的try-with-resources位如何處理這種情況感興趣。

try塊被視為完成之前, finally塊將始終執行。

根據JLS,第14.17節 ,返回聲明

嘗試將控制權轉移給包含它的方法的調用者;

前面的描述說的是“嘗試轉移控制權”,而不是僅僅說“轉移控制權”,因為如果方法或構造函數中的任何try語句(第14.20節)的try塊或catch子句包含return語句, 則這些子句的finally子句在將控制權轉移到方法或構造函數的調用者之前, 將按從內到外的順序執行try語句 finally子句的突然完成會破壞由return語句啟動的控制權的轉移。

(我的大膽強調)

也就是說, tryreturn語句將在實際返回之前執行finally塊。 因此,您的CloseableIterable將在返回給調用者之前關閉。

至於“ try-with-resources”,該代碼等效於try-catch-finally塊,因此其行為應相同。 根據JLS,第14.20.3節

在try-with-resources語句中使用變量(稱為資源)進行參數化,這些變量在try塊執行之前被初始化,並在執行try塊之后按照初始化時的相反順序自動關閉。

也就是說,您上面在Java 1.7中用“ try-with-resources”編寫的等效代碼為:

try (CloseableIterable<T> iterable = fetchStuffFromSomewhere()) {
    return iterable;
}

...,並且在將控制權轉移回方法的調用者之前,它仍將關閉它。

finally塊在return語句之前執行。 您將必須讓方法的客戶端代碼正確處理可迭代的實例(使其成為方法協定的一部分並正確記錄)。

同樣,值得通過實例學習。 在Java API中找到一個返回Closeable ,然后轉到其源代碼並查看其處理方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM