2013-04-22 158 views
3

我的問題是更多的爲什麼類型比如何Java 7試用資源(AutoCloseable)實現

我知道,在Java 7的以下工作:

try (
      FileInputStream in = new FileInputStream(source); 
      FileOutputStream out = new FileOutputStream(target); 
    ) { 
     ..................... 
     } catch (......) { 
     ............... 
     } 

和下面給出一個語法錯誤:

FileInputStream in; 
    FileOutputStream out; 
    try (
      in = new FileInputStream(source); 
      out = new FileOutputStream(target); 
    ) { 
     ..................... 
     } catch (......) { 
     ............... 
     } 

我很好奇,爲什麼是它Closable/Autoclosable引用如此重要要本地try塊?難道如果我們沒有擁有它,而不是關閉是危險的嗎?

+0

我似乎是一個重複的http://stackoverflow.com/questions/13836486/why-is-declaration-required-in-javas-try-with-resource?rq=1。所以這個問題已經被問到了,但我不相信它已經得到了回答。 – 2013-04-22 03:48:08

回答

7

我沒有這種語言設計決策的參考,但我認爲問題是允許非本地變量被自動閉鎖將是危險的—也就是說,它會允許許多不安全的編碼風格。從the Java Language Specification

A resource declared in a ResourceSpecification is implicitly declared final (§4.12.4) if it is not explicitly declared final.

如果資源沒有final,那麼try塊內他們可能會被重新分配,導致資源泄漏。由於它們(隱式或顯式地)final,編譯器將不得不做大量額外的工作以確保在輸入try資源規格時變量爲definitely unassigned。它可能還需要更改final的編譯器語義,因爲在try塊退出後,變量確實不應具有有效值;當然不是在try資源規範中分配給它們的值。最簡潔(或許唯一)的做法是當try塊退出時使變量超出範圍。

+0

謝謝你的鏈接。 – 2013-04-22 04:21:50