2011-04-06 136 views
2

我需要設計一個將OutputStream作爲參數的API方法。關於流的API設計建議

關閉API方法中的流還是讓調用者關閉流是一種好習慣?

test(OutputStream os) { 

os.close() //??? 
} 

回答

6

我認爲它應該是對稱的。

如果您未打開該流(可能是您的情況),則一般情況下您都不應關閉它。

+0

+1對於「對稱」 – 2011-04-06 05:31:33

3

除非API的目的是「完成流」,否則應該讓調用者關閉。他首先擁有了它,他對此負責,並且他可能會決定將一些東西寫入API,但最初並未設想。保持您的功能分離;它更可組合。

3

讓用戶關閉它。由於您在參數中使用OutputStream,所以我們可以認爲用戶已經創建並打開了它。所以,如果你關閉你的方法,它會不好。如果您只是將新的OutputStream作爲參數並在您的方法中打開它,則無需將其作爲參數,也可以在方法中關閉它。

0

不同的用例需要不同的模式,例如,取決於調用者是否需要在調用完成後讀取或寫入流。

關鍵的API設計規則是API應該指定無論是調用者還是調用方法關閉流的責任。儘管如此,如果打開流的代碼也負責關閉它,它通常更簡單和更安全。

考慮以下情況:methodA應該打開一個流並將其傳遞給methodB的情況,但有一個異常數據流被打開和methodB進入try/finally聲明,其結果是關閉它負責之間拋出。你需要編寫它類似於下面的東西,以保證流不漏:

public void methodA() throws IOException { 
     InputStream myStream = new FileInputStream(...); 
     try { 
      // do stuff with stream 
      methodB(myStream); 
     } finally { 
      myStream.close(); 
     } 
    } 

    /** 
    * @param myStream this method is responsible for closing myStream. 
    */ 
    public void methodB(InputStream myStream) throws IOException { 
     try { 
      // do more stuff with myStream 
     } finally { 
      myStream.close(); 
     } 
    } 

這不會泄露一個開放的流作爲例外的結果扔在任何methodAmethodB(或錯誤!)。 (它適用於標準流類型,因爲Closable API指定close在已關閉的流上調用時不起作用。)