当前位置: 首页 > 面试题库 >

Java为什么要实现finalize()?

何玉韵
2023-03-14
问题内容

我已经阅读了许多关于Java的新手问题finalize(),发现令人困惑的是,没有人真的说过finalize()是清理资源的不可靠方法。我看到有人评论说他们用它来清理Connections,这确实很吓人,因为要保证Connection关闭的唯一方法就是最终实现try(catch)

我没有在CS上学,但是近十年来我一直在用Java专业编程,而且从未见过有人finalize()在生产系统中实现过。这仍然并不意味着它没有用途,或者与我一起工作的人都在正确地做它。

所以我的问题是,存在哪些用例finalize()无法通过语言中的其他过程或语法更可靠地处理?

请提供特定的方案或你的经验,仅仅重复一本Java教科书,或完成最终的预期用途是不够的,这不是此问题的意图。


问题答案:

你可以将其用作保存外部资源(套接字,文件等)的对象的支持。实现close()需要调用的方法和文档。

如果发现尚未完成finalize(),请实施close()处理。也许有一些东西要转而stderr指出你是在有错误的呼叫者之后进行清理。

在特殊/越野情况下,它可提供额外的安全性。并非每个呼叫者每次都会做正确的try {} finally {}事情。不幸的是,但在大多数环境中都是如此。

我同意很少需要它。正如评论者所指出的,它带有GC开销。仅在长期运行的应用程序中需要“皮带和吊带”安全性时使用。

从Java 9开始,我Object.finalize()已经过时了!他们指出,我们java.lang.ref.Cleanerjava.lang.ref.PhantomReference作为替代品。



 类似资料:
  • 我没有受过CS方面的教育,但我已经专业地用Java编程近十年了,我从未见过任何人在生产系统中实现。这并不意味着它没有它的用途,或者和我一起工作的人一直在做正确的事情。 所以我的问题是,有哪些实现的用例不能通过语言中的另一个进程或语法更可靠地处理? 请提供具体的场景或您的经验,简单地重复一本Java教科书,或者Finalize的预期用途是不够的,因为这不是本问题的意图。

  • 我被这个概念困住了。 这是我在一个站点上看到的解释的一部分: 隐藏实现 我是这样想象的: 库客户机是否知道这个实现有什么区别?

  • Java线程的run()方法在线程启动时由该线程上的JVM调用。要让线程做一些事情,您可以创建thread的子类并重写它的run()方法,或者(最好)您可以为线程的构造函数提供一个Runnable。那很好。 当时我正在创建Thread的子类并重写run,我意识到我不能像预期的那样使方法受到保护,因为Thread.run()是公共的。然后我意识到为什么:它必须是公共的,因为Thread实现了Runn

  • 使用ScalaTest 3.0.0环境:Scala 2.11.8、sbt 0.13.5、IntelliJ 14.1.4 建筑sbt只有 以下测试通过。然而,IntelliJ在MyMiniTest下方标记了一条弯曲的红线,并显示警告信息: 类“MyMiniTest”必须声明为抽象的,或实现抽象成员“convertToLegacyEqualizer[T](左:T):TripleEqualSupport

  • 问题内容: 在托管bean中,是在常规Java对象构造函数之后调用的。 为什么要使用初始化而不是常规构造函数本身? 问题答案: 因为在调用构造函数时,bean尚未初始化-即没有注入依赖项。在该@PostConstruct方法中,bean已完全初始化,你可以使用依赖项。 因为这是保证可以在bean生命周期中仅调用一次此方法的协定。可能会发生(尽管不太可能)容器在其内部工作中多次实例化bean,但它保

  • 本文向大家介绍Java中为什么要用 clone?相关面试题,主要包含被问及Java中为什么要用 clone?时的应答技巧和注意事项,需要的朋友参考一下 在实际编程过程中,我们常常要遇到这种情况:有一个对象 A,在某一时刻 A 中已经包含了一些有效值,此时可能会需要一个和 A 完全相同新对象 B,并且此后对 B 任何改动都不会影响到 A 中的值,也就是说,A 与 B 是两个独立的对象,但 B 的初始