你如何用Java编写解构函数?

时间:2010-03-15 22:16:31

标签: java

我遇到了这个问题并且正在寻找一些想法?

7 个答案:

答案 0 :(得分:15)

你不需要(也不应该尝试使用)析构函数 - 或者在Java中调用它们:“终结器”。

VM规范允许VM实现永远不会调用它们。因此,它们对资源发布等不可靠。一般来说,在对象被垃圾收集之前,VM可以调用任何对象的finalize()方法中的代码,但由于这不是强制性的,因此应该避免使用它。

答案 1 :(得分:4)

Java是垃圾收集的,因此无法确定何时调用析构函数(当您的对象被垃圾收集时)。

有一个finalize(继承)方法,但由于上面的确切原因你不能依赖它(你无法预测何时 - 以及它是否会被调用)。

答案 2 :(得分:2)

如果您只需要清理一些资源,可以拨打Runtime.getRuntime().addShutdownHook

答案 3 :(得分:2)

Java中的自动对象“破坏”永远不会在保证的时间发生。垃圾收集的唯一受助者是在收集对象之前将调用终结器方法。当然垃圾收集器永远不能保证运行,或者在运行时做任何事情。因此无法保证将调用finalize方法。

如果你想在Java中模拟C ++析构函数,最好的方法是使用下面的习惯用法(当出现异常处理时会有变化 - 我只会在这里展示最简单的情况):

final Resource r;

r = new Resource();

try
{
    r.use();
}
finally
{
    r.cleanup();
}

其中“cleanup”方法是“析构函数”。

这更像是基于堆栈的对象的C++ Resource Acquisition Is Initialization idiom,但不是很好。

答案 4 :(得分:1)

您可以查看此内容以获取有关最终​​确定的更多信息 - finalize() method

答案 5 :(得分:0)

由于其他人正在讨论正常情况。在特殊情况下,您要创建destroy()destruct()releaseExternalResources()shutdown()等方法由控制该实例生命周期的实体主动调用

例如,对象可以是ActiveObject,其中包含活动线程。在这种情况下,您要关闭它们,否则您将有内存泄漏。

虽然有人可能不会称之为析构函数......

在旁注中,我猜这个面试问题是一个技巧问题!

答案 6 :(得分:0)

从Java 1.7开始,可以使用Try-with-resources

任何继承自CloseableAutocloseable的内容都可以使用它。

https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

try (FileReader br = new FileReader(path)) {
    return br.readLine();
}

这将自动调用close函数,该函数保证在块结束时被调用。