8

我处理它的方法类似于删除任何常用对象的情况,即简单地将引用设为空并让垃圾收集器完成其工作。

然而,为了在类中等同于 null,对对象的唯一引用是“this”。以下类的代码也是有效的:

class A{
  public A(){
    //Init
  }

  public void method destruct(){
    if(someCondition){
      this=null;  //Is this statement valid? Why / Why not?
    }
  }
}
4

14 回答 14

18

您不会在 Java 中“破坏”对象。这是大错特错。不要这样做。

在 Java 中,对象是在堆上创建的。只要有一个指向他们的参考资料,他们就会活着。垃圾收集器清理混乱。

你当然应该尽你所能确保你不会积累和持有不必要的引用(例如,Swing 中的 Listeners)。

但你的提议根本不是正确的。停止并停止。

于 2012-06-11T12:46:12.210 回答
11
this=null;  //Is this statement valid? Why / Why not?

它不是有效的 Java,因为this它不是左值;即不是你可以分配的东西。这是一个编译错误,就像编译错误一样42 = i;

(JLS 对赋值有以下说明: “赋值运算符的第一个操作数的结果必须是变量,否则会发生编译时错误。” - JLS 15.26.1 然后 JLS 文本继续列出不同的事物有资格作为变量,而this不是其中之一。)

此外,正如 duffymo 所说,在 Java 中做这件事是完全错误的。让 GC 完成它的工作。

于 2012-06-11T12:50:31.480 回答
3

注意:您的建议不太可能有用。

您可以做的是使用委托。

class A {
   private AImpl impl = new AImpl();

   public void close() {
      if (impl != null)
         impl.close();
      impl = null;
   }
}

由于所有引用都是间接的,因此您可以确保只有一个对真实对象的引用并将其清除。


卸载组件时,某些 OSGi 容器中的代理会执行此操作。由于容器对引用的生命周期几乎没有控制权,因此很难卸载库(实现)。

于 2012-06-11T12:48:46.910 回答
1

你的目标被严重误导了。

实例之外的任何人都持有对它的非弱引用。那么无论你在里面做什么,它都不会被收集。或者没有人做,那么它最终会被收集起来,不管你在里面做什么。在任何一种情况下,this=null都没有区别,即使它是合法的 Java 代码。不要这样做。如果您担心对象的生命周期和内存耗尽,请注意要摆脱的对象。

于 2012-06-11T12:48:30.070 回答
1

设置this = null就像试图说一个对象不引用自己。它总是隐含地引用自己。您需要找到可能引用此对象的其他对象并清除它们的引用。通常,这会自动发生,因为大多数对象是通过堆栈上的局部变量保留的。当我说“保留”时,我的意思是它们通过引用链被引用,最终导致堆栈上的变量。当您离开该方法时,引用将被清除。但是,如果您有一个引用此对象的静态变量,则可能是您必须将其显式设置为 null 的情况。

于 2012-06-11T12:48:56.813 回答
0

对象的生命周期由 JVM 控制,因此对象无法决定何时不再需要自己。您可以做的是在对该对象的引用上付出一些努力。可以使用引用类型来指出对象的“重要性”。

java中的基本引用类型可以在这里找到:

更多信息:http: //docs.oracle.com/javase/1.3/docs/api/java/lang/ref/package-summary.html

讨论这里的引用: Java中的软引用和弱引用有什么区别?了解 Java 的参考类:SoftReference、WeakReference 和 PhantomReference

于 2012-06-11T12:51:10.043 回答
0

执行线程在 destruct() 方法内部的原因告诉我,有一个调用者持有对这个类 A 实例的引用。所以,尽管如此,你不能在 java 中做任何类似“this = null”的事情 -它不会有帮助,即使它在 java 中是允许的。你不能破坏java中的对象。

于 2013-06-25T02:16:34.130 回答
0

不,上面的代码无效。this只要 JVM 正在执行,类的引用就会持续。设置实际上this == null会给你一个编译器错误,因为虽然this被称为引用,但它实际上是一个值,你不能一个值分配任何东西。

这也是不必要的,因为this只有在该代码中执行并且 GC 不能声明仍在执行的对象时才有效。但是,一旦对象的执行结束,它this也会丢失,并且该对象将自动变得可用于 GC(即,如果不存在对该对象的其他引用)

于 2012-06-11T13:01:39.710 回答
0

为了让 java 垃圾收集器拾取你的类,它不应该被引用为 OTHER 类。

该语句this=null;是非法的,因为赋值的左侧必须是变量。

于 2012-06-11T12:48:27.873 回答
0

没有办法delete在 Java 中显式地显示特定的引用。Java 这样做是为了避免挂起引用。如果您delete是一个对象,那么其他对象引用它可能会尝试访问数据并获取对无效数据的引用。

无论如何,您不应该尝试delete对象,只需将对该对象的所有引用移动到 null 即可。

于 2012-06-11T12:48:45.803 回答
0

不。当没有引用指向实例对象时,GC 可以删除实例对象,即它从所有正在运行的线程中都无法导航到该对象。当你在对象中执行一个方法时,这个方法是从外部调用的,所以有一个对象的引用。对象本身不能被销毁,因为对它的引用仍然存在于外部。

考虑另一种内存管理方法。

于 2012-06-11T12:48:52.903 回答
0

在方法this中是对调用当前方法的对象的引用,因此不应更改它。将此视为最终参考。

于 2012-06-11T12:49:01.200 回答
0

您可以致电:

 System.gc() or RuntimeUtil.gc() from the jlibs

但是如果你这样做,你会弄乱 JVM 运行时。如果将引用设置为 null,则该对象仍然存在,它只是它的引用不会引用该对象,并且在下次调用 GC 时它将销毁该对象(除非其他引用引用它)。

于 2012-06-11T12:56:54.223 回答
0

这是一个编译错误。您不能将 NULL 分配给“this”。关键字'this'可以用在equals的右边(除了左边不是NULL。原因:什么都不能赋值给null)。

对于破坏,在 java 中,你有一个 GC 可以在幕后为你完成这项工作。

请注意,对于用户定义的对象,您仍然可以执行以下操作 -

object reference = null;

但是 'this' 不能用在等号的左边。

于 2012-06-11T13:05:55.000 回答