首页 > 解决方案 > 如何在 Java 中关闭和“销毁”对象是正确的

问题描述

我有一张地图

public class MyMap implements Map<String,String>

它在 DB 中做了一些事情,它应该执行以下销毁方法之一:

  1. 如果垃圾收集器破坏了 myMap 而没有close()它应该执行clear()方法
  2. 如果对象在 之后销毁close(),则所有数据都保存在 DB 中

它应该像 FileWriter 一样工作。如果你关闭流 - 数据保存,如果你不 - 你输了:(

我应该使用什么?finalize(),简单地实现CloseableAutoCloseable不同的东西?

标签: java

解决方案


finalize()自 Java 9 起已弃用。如果VM退出,它可能不会被调用:如果你调用Runtime.runFinalizersOnExit(true)它将被执行(但还有其他问题)。

相反,您应该实施AutoClosable.

这允许Map使用try-with-resources.

您也可以close()FileWriter您的close()方法中作为FileWriter实现Closeable(甚至AutoCloseable)。

如果您愿意,您可以覆盖该finalize()方法作为备份,以防关闭无法正常工作,但要注意性能问题以及以下内容,如我的源代码所述:

  • 总是调用 super.finalize() 你的 finalize() 方法。
  • 不要将时间关键的应用程序逻辑放入 finalize(),看到它的不可预测性。
  • 不要使用 Runtime.runFinalizersOnExit(true); ,因为它会使您的系统处于危险之中。
  • 自己捕获并记录异常,因为系统会忽略它们。

推荐阅读