我需要設計一個將OutputStream作爲參數的API方法。關於流的API設計建議
關閉API方法中的流還是讓調用者關閉流是一種好習慣?
test(OutputStream os) {
os.close() //???
}
我需要設計一個將OutputStream作爲參數的API方法。關於流的API設計建議
關閉API方法中的流還是讓調用者關閉流是一種好習慣?
test(OutputStream os) {
os.close() //???
}
我認爲它應該是對稱的。
如果您未打開該流(可能是您的情況),則一般情況下您都不應關閉它。
除非API的目的是「完成流」,否則應該讓調用者關閉。他首先擁有了它,他對此負責,並且他可能會決定將一些東西寫入API,但最初並未設想。保持您的功能分離;它更可組合。
讓用戶關閉它。由於您在參數中使用OutputStream,所以我們可以認爲用戶已經創建並打開了它。所以,如果你關閉你的方法,它會不好。如果您只是將新的OutputStream作爲參數並在您的方法中打開它,則無需將其作爲參數,也可以在方法中關閉它。
不同的用例需要不同的模式,例如,取決於調用者是否需要在調用完成後讀取或寫入流。
關鍵的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();
}
}
這不會泄露一個開放的流作爲例外的結果扔在任何methodA
或methodB
(或錯誤!)。 (它適用於標準流類型,因爲Closable
API指定close
在已關閉的流上調用時不起作用。)
+1對於「對稱」 – 2011-04-06 05:31:33