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

时间:2015-06-03 16:42:20

标签: java arrays object memory-leaks null

我只是想知道在将它添加到数组后是否应该obj = null请注意,这是一个特殊情况,请参阅下文。

首先,让我们考虑这样的课程A

public class A {
    public void doSomething(B object) {
        // some code here
    }
}

和类B是这样的:

public class B {
    private final A a;
    public B(A a) {
        this.a = a;
    }
    public void aMethod() {
        // Does something here
        a.doSomething(this);
    }
}

直到现在一切都还好。 B类型的对象可以调用A的{​​{1}}方法根据那里的某些数据编辑对象。

现在让我们考虑以下情况:doSomething()将对象B添加到arraylist。现在我应该使用这些代码:

doSomething()

在第一个public void doSomething(B b) { arrayList.add(b); b = null; } // or public void doSomething(B b) { arrayList.add(b); } 中,我们将对象设置为null,这意味着方法调用者变为null。嗯,这对我来说没问题,因为doSomething()来电是我doSomething()中需要的最后一句话。但这样做有好处吗?

2 个答案:

答案 0 :(得分:8)

只需使用:

public void doSomething(B b) {
    arrayList.add(b);
}

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

RE

  

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

我认为你的案子并不特别。

  

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

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

答案 1 :(得分:5)

没有;它过分混淆了doSomething的责任。它为什么要关心它插入的生命周期是什么?

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

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