2010-06-15 26 views
1

我有問題。有什麼不對的關於下面的代碼:關於物體回收

ArrayList tempList2 = new ArrayList(); 
tempList2 = getXYZ(tempList1, tempList2); 

//method getXYZ 
getXYZ(ArrayList tempList1, ArrayList tempList2) { 

    //does some logic and adds objects into tempList2 

    return tempList2; 
} 

的代碼將得到執行,但它似乎通過傳遞tempList2到getXYZ方法的說法,它是做對象回收。

我的問題是,回收tempList2 arraylist對象是否正確?

回答

3

我的問題是,回收tempList2 arraylist對象是否正確?

我不太清楚「回收」是什麼意思。這似乎並不是應用程序爲了避免分配新對象而回收對象的情況。 (這是Java中「回收」的正常含義。)

如果getXYZ被多次調用同一個tempList2對象,那麼這只是一種將東西聚合成單個列表的方法。 getXYZ返回ArrayList的事實使得方法實現可能被更改爲返回不同的實例的可能性。這不是問題本身,但它可能是如果調用方沒有適當地分配調用結果。

如果getXYZ只針對任何給定的tempList2對象調用一次,那麼這看起來有點奇怪。

總之,這段代碼看起來有點可疑,而且如果有人改變了getXYZ的實現,它是脆弱的。然而,這並不是錯誤的,並且這樣做可能有一些很好的理由(或者歷史原因),這在你提到的問題的小塊代碼中並不明顯。

編輯 - 迴應此評論(內聯,使其可讀)

實際上,上面的代碼的原因是,我想避免創建兩個數組列表對象。對於例如:傳統的方法是

ArrayList tempList2 = new ArrayList(); 
tempList2 = getXYZ(tempList1); 

//method getXYZ 
getXYZ(ArrayList tempList1) { 
    ArrayList tempList = new ArrayList(); 
    //INSTANTIATED ONLY ONCE 
    //does some logic and adds objects into tempList 
    return tempList; 
} 

這樣做的真正傳統的方法是:

ArrayList tempList2 = getXYZ(tempList1); 

ArrayList tempList2; 
// some intermediate lines 
tempList2 = getXYZ(tempList1); 

這些都不需要創建不必要的ArrayList您的方法的實例,並且都不要求將實例傳遞給getXYZ方法。

+0

其實,上面的代碼的原因是,我想避免創建兩個arraylist對象。例如:傳統的方法是 ArrayList tempList2 = new ArrayList(); tempList2 = getXYZ(tempList1); //方法getXYZ getXYZ(ArrayList tempList1){ ArrayList tempList = new ArrayList(); // INSTANTIATED ONLY ONCE //執行一些邏輯並將對象添加到tempList中 return tempList; } – user366930 2010-06-15 06:35:54

0

您傳遞的是tempList2引用的值。該對象本身不被複制。所以當傳入的tempList2被修改時,調用者會看到更改。這也被稱爲call-by-sharing

所以沒有什麼錯,一旦你明白髮生了什麼。

+1

我想補充一點,這種行爲通常在Java代碼中被忽略,這基本上依靠副作用來使事情發揮作用。這不會使這個錯誤,但我仍然避免做這樣的事情。 – Esko 2010-06-15 05:59:45

+0

這取決於。我會在公共API中避免它,但內部它可能很方便。 – 2010-06-15 06:06:44

3

這裏真的沒有「對象回收」這樣的概念。沒有什麼是被垃圾收集,如果這就是你感興趣的......至少,不,如果有這樣的沒有臺詞:

tempList2 = new ArrayList(); 

getXYZ()

ArrayList的引用傳遞到方法中,然後返回。就這樣。這只是一個參考 - 它不是對象本身。

現在你可以說返回ArrayList引用被傳遞給它的方法有點奇怪......通常用於流暢的接口,但在這裏似乎並不是這樣。