【问题标题】:What is the lifetime of unassigned object created in a constructor in java?在 java 的构造函数中创建的未分配对象的生命周期是多少?
【发布时间】:2019-08-05 04:01:19
【问题描述】:

我有一个类(A),其构造函数定义如下所示。在构造函数中,我通过将侦听器(接口)实现传递给 B 为 B 创建了一个对象,如下所示。

public class A {

    private String str;

    public A() {

       new B(new OnStringUpdatedListener() {

           public void onStringUpdated(String str) {
               A.this.str = str;
           }

       });
    }
}

在上面的代码中,B 的对象没有分配给 A 的任何字段或构造函数中的变量。

B 的对象的生命周期是多少? 它是在构造函数执行完成后立即标记为垃圾回收,还是因为它注册了一个修改 A 字段的侦听器而仍然存在。

【问题讨论】:

  • 这取决于B 的实际外观,但假设没有任何东西可以阻止它被垃圾收集的机会很高,它将在下次垃圾收集器运行时被标记并驱逐。我说“机会”是因为不能保证垃圾收集器会做什么或何时运行 - 出于性能或其他原因,它可能忽略该对象(尽管这不太可能)。

标签: java object constructor object-lifetime


【解决方案1】:

@Thomas 的评论很好。

OnStringUpdatedListener 修改什么并不重要。执行构造函数后,B 将无法通过任何引用访问。它将有资格获得 GC 并且可能被垃圾回收。

【讨论】:

  • 感谢您的回答。如果我必须将 B 的生命周期延长为 A 的生命周期,那么我应该将 B 的对象分配给 A 的字段,对吧?
  • @Vamshi 是的,您需要一个长寿的人来引用 B 以使其保持活力:A 的字段就可以了。
  • 谢谢@Andrew。这很有帮助。我从 IDE 建议中得到了这个,将包含 B 引用的字段转换为局部变量,因为除了构造函数之外,我没有在 A 类的任何地方使用它。
猜你喜欢
  • 1970-01-01
  • 2023-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-09-25
  • 2012-07-28
  • 1970-01-01
相关资源
最近更新 更多