java - 如何在 Java 中关闭和“销毁”对象是正确的
问题描述
我有一张地图
public class MyMap implements Map<String,String>
它在 DB 中做了一些事情,它应该执行以下销毁方法之一:
- 如果垃圾收集器破坏了 myMap 而没有
close()
它应该执行clear()
方法 - 如果对象在 之后销毁
close()
,则所有数据都保存在 DB 中
它应该像 FileWriter 一样工作。如果你关闭流 - 数据保存,如果你不 - 你输了:(
我应该使用什么?finalize()
,简单地实现Closeable
或AutoCloseable
不同的东西?
解决方案
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);
,因为它会使您的系统处于危险之中。
- 自己捕获并记录异常,因为系统会忽略它们。
推荐阅读
- datepicker - 在 Firefox 中显示本机选择器的方法
- javascript - 我们可以重用从 firebase 检索到的访问令牌,并且我们可以只从这些令牌中获取用户数据吗?
- c# - 使用事件进行集成测试 - 同时运行多个测试时出现异常
- java - Spring MVC 验证:只需要一个字段
- asp.net - 返回视图()不重定向页面
- javascript - 通过 html 和 javascript 发送自动邮件
- flutter - 当一个小部件在它前面颤动时在 PageView 中滑动
- javascript - 谷歌文件选择器:修复返回根文件夹出现空
- plot - 在 Mathematica 中绘制圆周上的分布
- amazon-web-services - AWS SQS 和 Lambda 函数:如何使 lambda 函数失败并强制消息返回队列