【问题标题】:Should I do obj = null after arraylist.add(obj)我应该在 arraylist.add(obj) 之后做 obj = null
【发布时间】:2015-06-03 16:42:20
【问题描述】:

我只是想知道我们是否应该在将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 的doSomething() 方法根据那里的一些数据编辑对象。

现在让我们考虑以下情况: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() 中的最后一个语句。但是这样做好吗?

【问题讨论】:

  • 不,方法调用者不会变为 null。 Java 是按值传递的。
  • 您还需要了解The Law of Demeter。
  • 我很困惑,你想通过设置b = null; 来完成什么?这样做没有任何意义,但如果你解释为什么你认为这是一个好主意或你认为它做了什么,那么我或其他人可以帮助你了解为什么它在宏伟的计划中基本上没有任何作用。跨度>
  • 他们认为他们正在影响传入的引用,而 Java 它不能以这种方式工作,这使得整个问题成为一个有争议的问题
  • 根本原因是根本原因相同的答案

标签: java arrays object memory-leaks null


【解决方案1】:

只需使用:

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

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

回复

请注意,这是一种特殊情况,请阅读下文。

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

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

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

【讨论】:

  • 对象不能设置为null。这条语句总结了 Java 中 pass-by-value 语义的所有内容。 +1
  • 感谢您和@makato。我不太确定这一点,因为它不是完全“按值传递”。在你设置它的值之前它是一个参考,因为如果你这样做 object.something() 它实际上会修改原始的 object。
  • 不完全是。您正在修改原始对象的属性,但这与 the 原始对象不同。
  • 编辑字段或调用函数时相同,但使用=将其更改为其他内容时则不同。 (这是我所相信的,因为)否则 Metrics 将如何工作?您只有它的最终声明,并调用方法通过传递指标来更新它,并且方法会修改字段。
【解决方案2】:

没有;它过多地将doSomething 的责任混为一谈。它为什么要关心它所插入的任何东西的生命周期是什么?

它也不会产生任何影响。由于 Java 是按值传递的,因此您只修改了 b 的作用域值,而不是 b 的来源。

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

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    相关资源
    最近更新 更多