关于物品回收

时间:2010-06-15 05:49:04

标签: java

我有一个问题。关于以下代码有什么问题:

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 个答案:

答案 0 :(得分:3)

这里真的没有“对象回收”这样的概念。没有什么是垃圾收集,如果这是你感兴趣的......至少,如果没有这样的行,那就不是:

tempList2 = new ArrayList();

getXYZ()内。

ArrayList的引用传递给方法,然后返回。就这样。它只是一个参考 - 它不是对象本身。

现在你可以说这个方法返回传递给它的ArrayList引用有点奇怪...通常用于流畅的接口,但这里似乎不是这样。< / p>

答案 1 :(得分:3)

  

我的问题是,回收tempList2 arraylist对象是否正确?

我不太清楚“回收”是什么意思。这似乎不是应用程序正在回收对象以避免分配新对象的情况。 (这是Java中“回收”的正常含义。)

如果使用相同的getXYZ对象多次调用tempList2,那么这只是将内容聚合到单个列表中的一种方式。 getXYZ返回ArrayList的事实使得可能会更改方法实现以返回不同的ArrayList实例。这不是问题本身,但可能是调用者没有适当地分配调用结果。

如果getXYZ仅针对任何给定的tempList2对象调用一次,那么这看起来有点奇怪。

总之,这段代码看起来有点可疑,如果有人更改了getXYZ的实现,则代码很脆弱。然而,这并非正确的错误,并且可能有一些很好的理由(或历史原因)以这种方式做事,这在您提交问题的小块代码中并不明显。

编辑 - 回应此评论(内联使其可读)

  

实际上,上面代码的原因是,我想避免创建两个arraylist对象。例如:传统的方法是

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实例,也不需要将2 ArrayList个实例传递到getXYZ方法。

答案 2 :(得分:0)

您传递的是tempList2引用的值。对象本身不会被复制。因此,当传入的tempList2被修改时,调用者会看到更改。这也称为call-by-sharing

一旦你理解了正在发生的事情,那就没有错。