創建對象並將其傳遞給參數vs在類的構造函數中聲明一個對象作爲參數的區別是什麼?像1)和2)有什麼區別?在構造函數中傳遞對象
1)
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
2)
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
創建對象並將其傳遞給參數vs在類的構造函數中聲明一個對象作爲參數的區別是什麼?像1)和2)有什麼區別?在構造函數中傳遞對象
1)
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
2)
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
兩個差異浮現在腦海中:
在理論,與所有功能於一身的建築,如果外部構造函數拋出一個異常,你會有一個內部對象的實例你永遠不會打電話給close
(因爲你沒有提及它,你可以用它來做),所以它不會被關閉,直到最終確定(如果那樣)。在實踐中,我不認爲BufferedReader
的構造可以拋出一個異常,而是......
這是什麼部分Java的新try-with-resources statement旨在幫助:
try (
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
)
{
// do your stuff here
}
使用try與資源,你可以肯定,即使第二個構造函數拋出,第一個對象被正確關閉。
注意,當您使用try-與資源與多個聲明如上,close
被稱爲在它們出現的相反順序,通常是你想要什麼(在這種情況下,br.close()
之前被調用isr.close()
)。
通過一體化構造,您假設外部對象將關閉當您關閉它時傳遞它的對象(因爲您再次沒有提及用於關閉的內部對象它)。 BufferedReader
的確如此,但可能並不普遍。通過確保調用close
,再次嘗試資源幫助。
如果你正在處理不需要close
或類似物體,有沒有兩者都相差無幾。在調試時單步執行單個語句比單步執行更容易,但除此之外,其中沒有多少內容。