Java有析构函数吗?我好像找不到任何关于这个的文件。如果没有,我怎样才能达到同样的效果?

为了使我的问题更具体,我正在编写一个处理数据的应用程序,规范说应该有一个“重置”按钮,使应用程序恢复到最初的启动状态。但是,除非应用程序关闭或按下重置按钮,否则所有数据必须是“活的”。

作为一个通常的C/ c++程序员,我认为这是微不足道的实现。(因此我打算最后实现它。)我构造了我的程序,使所有“可重置”的对象都在同一个类中,这样当按下重置按钮时,我就可以销毁所有“活动”对象。

我在想,如果我所做的只是解除对数据的引用,并等待垃圾收集器收集它们,如果我的用户重复输入数据并按下重置按钮,是否会出现内存泄漏?我还在想,既然Java作为一种语言相当成熟,应该有一种方法来防止这种情况发生或优雅地解决这个问题。


当前回答

在Lombok中有一个@Cleanup注释,它与c++的析构函数非常相似:

@Cleanup
ResourceClass resource = new ResourceClass();

在处理它时(在编译时),Lombok插入适当的try-finally块,以便在执行离开变量的作用域时调用resource.close()。你也可以显式地指定另一个方法来释放资源,例如resource.dispose():

@Cleanup("dispose")
ResourceClass resource = new ResourceClass();

其他回答

在Java中,垃圾收集器自动删除未使用的对象以释放内存。所以Java没有析构函数是很合理的。

如果你只是担心记忆,那就别担心了。相信GC,它做得不错。实际上,我发现它非常高效,在某些情况下,创建一堆小对象比使用大数组的性能更好。

如果您正在编写Java Applet,则可以重写Applet的“destroy()”方法。它是……

*由浏览器或applet查看器调用来通知 *这个applet,它正在被回收,它应该销毁 *已分配的任何资源。stop()方法 *总是在destroy()之前被调用。

显然不是你想要的,但可能是别人在寻找的。

我过去主要处理c++,这也是我寻找析构函数的原因。我现在经常使用JAVA。我所做的,可能对每个人来说都不是最好的,但我实现了我自己的析构函数通过将所有值重置为0或通过函数的默认值。

例子:

public myDestructor() {

variableA = 0; //INT
variableB = 0.0; //DOUBLE & FLOAT
variableC = "NO NAME ENTERED"; //TEXT & STRING
variableD = false; //BOOL

}

理想情况下,这并不适用于所有情况,但在有全局变量的情况下,只要你没有大量的全局变量,它就可以工作。

我知道我不是最好的Java程序员,但它似乎对我有用。

应该避免使用finalize()方法。它们不是一种可靠的资源清理机制,滥用它们可能会在垃圾收集器中引起问题。

如果你在对象中需要一个释放调用,比如释放资源,使用显式的方法调用。这个约定可以在现有的api中看到(例如Closeable, Graphics.dispose(), Widget.dispose()),通常通过try/finally调用。

Resource r = new Resource();
try {
    //work
} finally {
    r.dispose();
}

尝试使用已处理对象应该抛出运行时异常(参见IllegalStateException)。


编辑:

我在想,如果我所做的只是 来解除对数据的引用并等待 垃圾收集器来收集它们, 会不会有内存泄漏,如果我的 用户反复输入数据和 按了重置键?

一般来说,您所需要做的就是取消对对象的引用——至少,这是它应该工作的方式。如果您担心垃圾收集,请查看Java SE 6 HotSpot[tm]虚拟机垃圾收集调优(或您的JVM版本的等效文档)。