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

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

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

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


当前回答

想想最初的问题……我认为我们可以从所有其他学习过的答案中得出结论,也可以从Bloch的《有效Java》中得出结论,第7项“避免终结器”,以一种不适合Java语言的方式寻求合理问题的解决方案……

... OP实际上想要的是将所有需要重置的对象保存在一种“playpen”中,而所有其他不可重置的对象只能通过某种访问器对象引用该对象,这难道不是一个非常明显的解决方案吗?

然后当你需要“重置”时,你断开现有的游戏笔并创建一个新的游戏笔:游戏笔中所有的对象都被抛到一边,永远不会返回,有一天会被GC收集。

如果这些对象中的任何一个是可关闭的(或者不是,但有一个关闭方法),你可以在它们被创建(可能打开)时将它们放在游戏笔的一个袋子中,访问器在切断游戏笔之前的最后一个动作将是通过所有的关闭对象关闭它们……?

代码可能看起来像这样:

accessor.getPlaypen().closeCloseables();
accessor.setPlaypen( new Playpen() );

closeCloseables可能是一个阻塞方法,可能涉及一个闩锁(例如CountdownLatch),以处理(并等待)任何特定于Playpen的线程中的任何可运行对象/可调用对象在适当的时候结束,特别是在JavaFX线程中。

其他回答

不,. lang。Object#finalize是最接近的。

但是,不保证何时(以及是否)调用它。 看到:java.lang.Runtime # runFinalizersOnExit(布尔)

因为Java是一种垃圾收集语言,所以您无法预测对象何时(甚至是否)会被销毁。因此没有直接等价的析构函数。

有一个被称为finalize的继承方法,但它完全由垃圾回收器自行调用。因此,对于需要显式清理的类,约定是定义一个close方法,并仅使用finalize方法进行完整性检查(即,如果close未被调用,则立即执行并记录错误)。

最近有一个问题引发了关于finalize的深入讨论,所以如果需要的话,应该会提供更多的深度……

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

Java没有任何析构函数。在Java中,它背后的主要原因是垃圾收集器总是被动地在后台工作,所有对象都在堆内存中创建,这是GC工作的地方。在c++中,我们必须显式调用delete函数,因为没有垃圾收集器之类的东西。

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

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

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