如何用Java编写解构器?

如何用Java编写解构器?,java,Java,我遇到了这个问题,正在寻找一些想法 您不需要也不应该尝试使用析构函数——或者Java中所称的:终结器 VM规范允许VM实现从不调用它们。因此,它们对于资源发布等不可靠。一般来说,任何对象的finalize方法中的代码都可以在对象被垃圾收集之前由VM调用,但由于这不是强制性的,您应该避免使用它。您不需要也不应该尝试使用析构函数,或者它们在Java中被称为:Finalizers VM规范允许VM实现从不调用它们。因此,它们对于资源发布等不可靠。一般来说,任何对象的finalize方法中的代码都可以在

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

您不需要也不应该尝试使用析构函数——或者Java中所称的:终结器


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

您不需要也不应该尝试使用析构函数,或者它们在Java中被称为:Finalizers


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

Java是垃圾收集的,因此无法判断何时调用析构函数,何时将对对象进行垃圾收集


有一个finalize继承方法,但您不能依赖它,因为上面的确切原因,您无法预测何时以及是否调用它。

Java是垃圾收集的,因此无法判断何时调用析构函数,何时将垃圾收集对象


有一个finalize继承的方法,但您不能依赖它,因为上面的确切原因,您无法预测何时以及是否会调用它。

您可以查看此以了解有关finalize的更多信息-

您可以查看此以了解有关finalize的更多信息-

如果您只需要清理一些资源,如果只需要清理一些资源,可以调用

,也可以调用

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

如果你想模拟java中的C++析构函数,最好的方法是使用下面的成语,当它遇到异常处理时,会有变化。

final Resource r;

r = new Resource();

try
{
    r.use();
}
finally
{
    r.cleanup();
}
其中清理方法是析构函数


这更像是用于基于堆栈的对象,但没有那么好。

Java中的自动对象销毁从来不会在保证的时间内发生。垃圾收集的唯一授权对象是在收集对象之前,将调用终结器方法。当然,垃圾收集器永远不能保证运行,或者在运行时做任何事情。因此,不能保证将调用finalize方法

如果你想模拟java中的C++析构函数,最好的方法是使用下面的成语,当它遇到异常处理时,会有变化。

final Resource r;

r = new Resource();

try
{
    r.use();
}
finally
{
    r.cleanup();
}
其中清理方法是析构函数


这更像是针对基于堆栈的对象的,但没有那么好。

因为其他人都在谈论正常情况。。在某些特殊情况下,您需要创建destroy、destruct、releaseExternalResources、shutdown等方法,这些方法应由控制该实例生命周期的实体主动调用

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

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


顺便说一句,我猜面试的问题是一个骗人的问题

因为其他人都在谈论正常情况。。在某些特殊情况下,您需要创建destroy、destruct、releaseExternalResources、shutdown等方法,这些方法应由控制该实例生命周期的实体主动调用

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

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


顺便说一句,我猜面试的问题是一个骗人的问题

Try with resources从Java 1.7开始提供

从Closeable或Autocloseable继承的任何内容都可以使用它


这将自动调用一个close函数,该函数保证在块的末尾被调用。

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

从Closeable或Autocloseable继承的任何内容都可以使用它


这将自动调用一个close函数,该函数保证在块的末尾调用。

在一次考试中遇到了这个问题?在你的家庭作业中-他们不是也问过“不毁灭者”吗?如果我在采访中被问到这个问题,我会退出的。@skaffman-我会开始我的职业生涯

回答这个问题吧!这是个诡计!。如果面试官给我一个茫然的眼神,那么我可能会离开。在考试中遇到这个问题?在你的家庭作业中-他们不是也问过“不毁灭者”吗?如果我在采访中被问到这个问题,我早就退出了。@skaffman-我会用这个问题开始我的回答!。如果面试官给了我一个空白的眼神,那么我可能会离开。finalize不是一个破坏者,它有一个不同的、相当具体的含义。你是对的。我试图通过解释它不适用于资源释放和其他清理任务(通常是析构函数的用途)来说明这个概念的不同。关于finalize,唯一应该知道的是:永远不要使用它,否则小耶稣会哭:-!如果要关闭的资源仍处于打开状态,则应该使用它,但在调用它时记录。这样你就知道你错过了什么,可以去弥补它。我个人也不这样做,我只是确保我的代码是正确的:-@TofuBeer。应该指出的是,这样做将产生重大影响?垃圾收集器的额外负担;如果可以的话,这件事应该少做。有关更多详细信息,请使用ReferenceQueue阅读备选方案,从java.lang.ref.finalize的包文档开始。finalize不是析构函数,它具有不同且非常具体的含义。您是对的。我试图通过解释它不适用于资源释放和其他清理任务(通常是析构函数的用途)来说明这个概念的不同。关于finalize,唯一应该知道的是:永远不要使用它,否则小耶稣会哭:-!如果要关闭的资源仍处于打开状态,则应该使用它,但在调用它时记录。这样你就知道你错过了什么,可以去弥补它。我个人也不这样做,我只是确保我的代码是正确的:-@TofuBeer。应该指出的是,这样做将产生重大影响?垃圾收集器的额外负担;如果可以的话,这件事应该少做。要了解更多详细信息,请使用ReferenceQueue阅读备选方案,从java.lang.ref的包文档开始。其他人说不能保证将调用finalize。如果我理解正确的话,您是说如果对象被垃圾收集器破坏,那么finalize将被调用。所以不会调用finalize的唯一原因是垃圾收集器没有破坏特定的对象?是的,如果要收集对象,那么将调用finalizer。但是,没有被授权人保证每次都收集对象,因此不能保证调用终结器。看看——Java编程语言没有指定调用finalizer的时间,只是说它将在重用对象的存储之前发生。其他人说不能保证调用finalizer。如果我理解正确的话,您是说如果对象被垃圾收集器破坏,那么finalize将被调用。所以不会调用finalize的唯一原因是垃圾收集器没有破坏特定的对象?是的,如果要收集对象,那么将调用finalizer。但是,没有被授权人保证每次都收集对象,因此不能保证调用终结器。看看——Java编程语言没有指定调用终结器的时间,只是说它将在重用对象的存储之前发生。