Cha*_*aoz 2 java arrays null memory-leaks object
我只是想知道obj = null在将它添加到数组后是否应该这样做.请注意,这是一个特殊情况,请参阅下文.
首先,让我们考虑A这样的类:
public class A {
public void doSomething(B object) {
// some code here
}
}
Run Code Online (Sandbox Code Playgroud)
和这样的类B:
public class B {
private final A a;
public B(A a) {
this.a = a;
}
public void aMethod() {
// Does something here
a.doSomething(this);
}
}
Run Code Online (Sandbox Code Playgroud)
到现在为止一切都还好.类型的对象B可以调用A的doSomething()方法来编辑基于一些数据在那里的对象.
现在让我们考虑以下情况:doSomething()将对象B添加到arraylist.现在我应该使用这些代码:
public void doSomething(B b) {
arrayList.add(b);
b = null;
}
// or
public void doSomething(B b) {
arrayList.add(b);
}
Run Code Online (Sandbox Code Playgroud)
在第一个中,doSomething()我们将对象设置为null,这意味着方法调用者变为null.嗯,这对我来说没关系,因为doSomething()电话是我需要的最后一句话aMethod().但这样做有好处吗?
只需使用:
public void doSomething(B b) {
arrayList.add(b);
}
Run Code Online (Sandbox Code Playgroud)
绝对不需要将参数设置为null,因为当方法退出时,它(参数,而不是它引用的对象)不再存在.
回覆
请注意,这是一个特殊情况,请参阅下文.
我觉得你的情况没什么特别之处.
在第一个doSomething()中,我们将对象设置为null,这意味着方法调用者变为null.嗯,这对我来说没关系,因为doSomething()调用是我在aMethod()中需要的最后一个语句.但这样做有好处吗?
对象不能设置为null,只有变量和参数(它们是变量)才可以.您将引用与引用变量混淆,引用变量是Java中的核心区别.
没有; 它把doSomething太多的责任混为一谈.它为什么要关心它插入的生命周期是什么?
它也没有任何影响.由于Java是按值传递的,因此您只需要修改范围值b,而不是修改b源自的任何位置.
像这样的代码只会让那些在路上阅读它的人(也许是你自己)感到困惑,因为你描绘的行为具有误导性.如果您担心要插入的对象的生命周期,请注意,只要有引用它就不符合垃圾回收的条件.这意味着只要您添加的集合不符合条件,该引用也不符合条件.