我只是想知道在将它添加到数组后是否应该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()
中需要的最后一句话。但这样做有好处吗?
答案 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
来自的任何位置。
这样的代码只会让那些在路上阅读它的人(也许是你自己)感到困惑,因为你描绘的行为具有误导性。如果您担心要插入的对象的生命周期,请注意,只要有引用它就不符合垃圾回收的条件。这意味着只要您添加的集合不符合条件,该引用也不符合条件。