在 Java 中替换 finalize()

2022-09-01 14:32:39

Object.finalize()在Java 9中被弃用,我想我理解了原因,但我很难看到如何替换它。

我有一个名为 Configuration 的实用程序类,它本质上有一个实例,该实例拥有应用程序中的所有内容,并在应用程序期间持续存在。它提供的服务之一是日志记录:在第一次请求记录消息时,创建一个记录器(由于各种遗留原因,它是我自己的记录器而不是标准记录器),引用保存在配置对象的字段中,并且在应用程序终止时,无论是正常还是异常,我都想释放记录器持有的任何资源(这是一个黑匣子,因为我的库的用户可以提供自己的资源)实现)。

目前,这是通过调用 的方法实现的。Configuration.finalize()logger.close()

我应该做什么?


答案 1

Java 9 引入了 Clean 和 Cleanable 实用程序类,这些类负责将幻像引用连接到队列,并处理清空该队列的清理线程。

虽然这允许您分离出将在所属对象死亡后执行事后清理的见证服务器,但有关GC触发的资源管理的所有警告仍然适用,即仍然最好依靠并尝试使用资源块来管理资源的生命周期,而不是垃圾回收器。AutoClosable


答案 2

幻像引用是 的常规替代项。Java 运行时中的许多类已经在使用它们。finalize()

使用 Phantom 引用有点费力,你必须维护自己的引用列表和事后处理线程。另一方面,您可以完全控制。

下面是幻像参考设置的简单示例。

本文解释并比较了 Java 和 Phantom 引用的实现。finalize()