问题描述
我正在寻找一种方法来删除Java中的对象,使其符合GC条件。我有一个java类,需要调用其delete()方法。
public class SomeObj {
// some implementation stuff
//...
void delete() {
//remove yourself from some lists in the program
//...
this = null; // <- this line is illegal
//delete this; <- if I was in C++,I Could do this
}
}
我应该怎么做?显然,我将不得不重构代码,因为这听起来像是不良的设计。
解决方法
无论好坏,Java是一种在垃圾收集环境中运行的语言。对象在应用程序中具有某种形式的存在,只要它可以通过引用到达即可。一旦它不再可访问时-当没有其他对象拥有对它的引用时-就应用程序而言,它将被“删除”。
对象在堆中仍然具有一定的剩余寿命是垃圾收集器(而不是应用程序)的问题。在某种逻辑上,依赖于能够控制没有引用的对象的存在的应用程序已损坏。
想要永久地将未引用的对象从堆中移出的通常的,半合法的理由是节省堆空间。在很多情况下,我知道对象真正完成时比垃圾收集器做得更好。使用方法范围存储临时结果的对象就是一个很好的例子。我主要是C和C ++开发人员,我真的想在java.lang.Object
上使用一种称为ImDoneWithYouNow()
的方法。可悲的是,它不存在,我们必须依靠GC的实现来进行内存管理。
您不需要(实际上应该没有)“析构函数”。一旦没有其他对象引用了有问题的对象,该对象就可以进行垃圾回收,并且在垃圾回收器认为合适时将其删除。