2014-08-30 274 views
1

創建對象並將其傳遞給參數vs在類的構造函數中聲明一個對象作爲參數的區別是什麼?像1)和2)有什麼區別?在構造函數中傳遞對象

1)

InputStreamReader isr=new InputStreamReader(System.in); 
BufferedReader br=new BufferedReader(isr); 

2)

BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 

回答

2

兩個差異浮現在腦海中:

  1. 理論,與所有功能於一身的建築,如果外部構造函數拋出一個異常,你會有一個內部對象的實例你永遠不會打電話給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())。

  2. 通過一體化構造,您假設外部對象將關閉當您關閉它時傳遞它的對象(因爲您再次沒有提及用於關閉的內部對象它)。 BufferedReader的確如此,但可能並不普遍。通過確保調用close,再次嘗試資源幫助。

如果你正在處理不需要close或類似物體,有沒有兩者都相差無幾。在調試時單步執行單個語句比單步執行更容易,但除此之外,其中沒有多少內容。

相關問題