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

Should I do obj = null after arraylist.add(obj)

我只是想知道我们是否应该在将它添加到数组后执行 obj = null请注意,这是一个特例,请阅读下文。

首先,让我们这样考虑 class A

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

和class 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 类型的对象可以调用 AdoSomething() 方法来根据那里的一些数据编辑对象。

现在让我们考虑以下情况:doSomething() 将对象 B 添加到数组列表中。现在,如果我应该使用这些代码:

public void doSomething(B b) {
    arrayList.add(b);
    b = null;
}
// or
public void doSomething(B b) {
    arrayList.add(b);
}

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

只需使用:

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

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

回复

Note that this is about a special case, read below.

我看不出你的情况有什么特别之处。

In the first doSomething() we set the object to null, which means that the method caller becomes null. Well, that's OK to me as doSomething() call is the last statement I need to in my aMethod(). But is it good to do so?

对象不能设置为null,只有变量和参数(它们是变量)可以。您将引用与引用变量混淆了,这是 Java.

中的核心区别

否;它过多地混淆了 doSomething 的责任。为什么要关心它插入的任何内容的生命周期是什么?

也不会有任何效果。由于 Java 是按值传递的,您只是在修改 b 的作用域值,而不是 b 的来源。

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