有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

是否需要java的finalize方法?

我读到的关于java finalize方法的所有内容都说不能使用它。似乎它几乎从未保证会被调用,甚至在调用时也可能出现问题

还有一些其他问题会问什么时候使用它,而且似乎普遍的共识是永远不会

我自己从来没有使用过它(主要是因为警告不要使用),我也没有在任何地方看到过它

是否有合适的情况?是否存在没有其他选择的情况

如果没有,为什么会有?是否有内部类使用它并要求该方法可用?或者只是一些不该出现的东西

我对什么时候应该使用它(答案是“从不”)不太感兴趣,但我想澄清一下为什么它会出现,因为答案是“从不”。如果它是如此无用和危险,为什么它没有被贬值和删除


共 (2) 个答案

  1. # 1 楼答案

    您可以使用它并且可以接受它的一个用例是释放不在JVM控制下的资源,也就是说,如果没有JVM,这些资源将不会被释放。例如,使用sun.misc.Unsafe(*)分配的内存必须手动释放,因为它不会被垃圾收集。因此,如果以前没有释放过内存,您可以使用finalize方法作为最后的手段来释放内存-只是为了确保您的程序没有内存泄漏。但是这些情况非常罕见,现在Java提供了更好的替代方案,如Java7中引入的AutoClosable接口

    您可以在OpenJDK源代码中找到更多示例,例如FileInputStream,它使用finalize方法确保它被关闭

    (*)不要使用它,它之所以被称为Unsafe是有原因的

    编辑:回答您评论中的问题

    java API出于某种原因需要它吗

    是和否。Java Language Specification表示它必须存在。Java库中的一些类也使用它(例如,当它们处理文件时),但是没有Java API要求您为类实现它

    出于某种原因,JVM必须在所有对象上看到该方法吗

    是的,因为JLS这么说,垃圾收集器为它收集的每个对象调用它

    Called by the garbage collector on an object when garbage collection determines that there are no more references to the object.

    但是它确实在所有对象上看到了finalize方法,因为Objectimplements it-并且它对每个默认值都不做任何操作

    protected void finalize() throws Throwable { }
    
  2. # 2 楼答案

    向后兼容性。有人最初认为这是一个好主意,但当全世界意识到这不是一个好主意时,为时已晚

    这些东西几乎从未被移除过。Java充满了如今被认为是坏主意但却没有被删除的概念——我想到的更多例子是^{}^{}