Java 关于物品回收
我有个问题。以下代码有什么问题:Java 关于物品回收,java,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; } 代码将被执行,
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对象是否正确?您正在传递
tempList2
引用的值。对象本身没有被复制。因此,当传入的tempList2
被修改时,调用者会看到更改。这也叫
因此,一旦您了解了发生了什么,就没有什么问题。您正在传递
tempList2
引用的值。对象本身没有被复制。因此,当传入的tempList2
被修改时,调用者会看到更改。这也叫
所以,一旦你明白了发生了什么,就没有什么错。这里真的没有“物体回收”这样的概念。没有垃圾被收集,如果你感兴趣的话。。。至少,如果没有这样的行,就不会:
tempList2 = new ArrayList();
在getXYZ()
中
对ArrayList
的引用被传递到方法中,然后返回。这就是全部。它只是一个引用-它不是对象本身
现在您可以说,该方法返回传递给它的
ArrayList
引用有点奇怪。。。这通常用于流畅的接口,但这里似乎不是这样。这里真的没有“对象回收”这样的概念。没有垃圾被收集,如果你感兴趣的话。。。至少,如果没有这样的行,就不会:
tempList2 = new ArrayList();
在getXYZ()
中
对ArrayList
的引用被传递到方法中,然后返回。这就是全部。它只是一个引用-它不是对象本身
现在您可以说,该方法返回传递给它的ArrayList
引用有点奇怪。。。通常这用于流畅的接口,但这里的情况似乎不是这样
我的问题是,回收Templist2ArrayList对象是否正确
我不太明白你说的“回收”是什么意思。这似乎不是应用程序为了避免分配新对象而循环使用对象的情况。(这是Java中“回收”的正常含义。)
如果使用相同的tempList2
对象多次调用getXYZ
,那么这只是将内容聚合到单个列表中的一种方法。getXYZ
返回一个ArrayList
的事实使得方法实现可能被更改为返回一个不同的ArrayList
实例。这本身不是问题,但如果调用方没有适当地分配调用结果,则可能是问题
如果对任何给定的tempList2
对象只调用一次getXYZ
,那么这看起来有点奇怪
总之,这段代码看起来有点可疑,如果有人更改了getXYZ
的实现,这段代码就很脆弱。然而,这并不是完全错误的,并且可能有一些很好的理由(或历史原因)以这种方式做事情,而这些理由在问题中包含的小块代码中并不明显
编辑-回应此评论(内联以使其可读)
实际上,上面代码的原因是,我想避免创建两个arraylist对象。例如:传统的方法是
这样做的真正传统方式是:
ArrayList tempList2 = getXYZ(tempList1);
或
这两种方法都不需要创建方法中不必要的ArrayList
实例,也不需要将2个ArrayList
实例传递到getXYZ
方法中
我的问题是,回收Templist2ArrayList对象是否正确
我不太明白你说的“回收”是什么意思。这似乎不是应用程序为了避免分配新对象而循环使用对象的情况。(这是Java中“回收”的正常含义。)
如果使用相同的tempList2
对象多次调用getXYZ
,那么这只是将内容聚合到单个列表中的一种方法。getXYZ
返回一个ArrayList
的事实使得方法实现可能被更改为返回一个不同的ArrayList
实例。这本身不是问题,但如果调用方没有适当地分配调用结果,则可能是问题
如果对任何给定的tempList2
对象只调用一次getXYZ
,那么这看起来有点奇怪
总之,这段代码看起来有点可疑,如果有人更改了getXYZ
的实现,这段代码就很脆弱。然而,这并不是完全错误的,并且可能有一些很好的理由(或历史原因)以这种方式做事情,而这些理由在问题中包含的小块代码中并不明显
编辑-回应此评论(内联以使其可读)
实际上,上面代码的原因是,我想避免创建两个arraylist对象。例如:传统的方法是
这样做的真正传统方式是:
ArrayList tempList2 = getXYZ(tempList1);
或
这两种方法都不需要创建不必要的
ArrayList
实例,也不需要将2个ArrayList
实例传递到getXYZ
方法中。我想补充一点,Java代码中通常不赞成这种行为,这基本上是依靠副作用来实现的。这并不意味着这是错误的,但我还是会避免做类似的事情。这要看情况而定。我会在公共API中避免这种行为,但在内部它可能很方便。我想补充一点,这种行为在Java代码中通常是不受欢迎的,这基本上是依赖于一方