我应该在arraylist.add(obj)之后做obj = null

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可以调用AdoSomething()方法来编辑基于一些数据在那里的对象.

现在让我们考虑以下情况: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().但这样做有好处吗?

Hov*_*els 8

只需使用:

public void doSomething(B b) {
    arrayList.add(b);
}
Run Code Online (Sandbox Code Playgroud)

绝对不需要将参数设置为null,因为当方法退出时,它(参数,而不是它引用的对象)不再存在.

回覆

请注意,这是一个特殊情况,请参阅下文.

我觉得你的情况没什么特别之处.

在第一个doSomething()中,我们将对象设置为null,这意味着方法调用者变为null.嗯,这对我来说没关系,因为doSomething()调用是我在aMethod()中需要的最后一个语句.但这样做有好处吗?

对象不能设置为null,只有变量和参数(它们是变量)才可以.您将引用与引用变量混淆,引用变量是Java中的核心区别.


Mak*_*oto 5

没有; 它把doSomething太多的责任混为一谈.它为什么要关心它插入的生命周期是什么?

它也没有任何影响.由于Java是按值传递的,因此您只需要修改范围值b,而不是修改b源自的任何位置.

像这样的代码只会让那些在路上阅读它的人(也许是你自己)感到困惑,因为你描绘的行为具有误导性.如果您担心要插入的对象的生命周期,请注意,只要有引用它就不符合垃圾回收的条件.这意味着只要您添加的集合不符合条件,该引用也不符合条件.