这主要是出于好奇。
除了调试/日志记录/分析目的之外,如果有人遇到过 Object.finalize() 的任何好的用法,我一直在徘徊?
如果您还没有遇到任何问题,您会说什么是好的用法?
这主要是出于好奇。
除了调试/日志记录/分析目的之外,如果有人遇到过 Object.finalize() 的任何好的用法,我一直在徘徊?
如果您还没有遇到任何问题,您会说什么是好的用法?
如果您的 Java 对象使用 JNI 来指示本机代码分配本机内存,则需要使用 finalize 以确保它被释放。
在这里聚会迟到了,但我想我还是会插话:
我发现终结器的最佳用途之一是调用显式终止方法,无论出于何种原因,这些方法都没有被调用。发生这种情况时,我们也会记录问题,因为它是一个 BUG!
因为:
这只留下了他们可以在没有太大风险的情况下解决的少数任务。
但这只是一个后备,使用的是“正常”机制并没有工作。正常机制应明确启动。
释放正常情况下应该手动释放,但由于某种原因没有释放的资源。也许在日志中写入警告。
在使用软引用缓存数据库支持的对象时,我使用它将数据写回数据库。
我看到 finalize() 有一个很好的用途:释放大量可用且非独占的资源。
例如,默认情况下,有 1024 个文件句柄可用于 Linux 进程,大约 10000 个可用于 Windows。这差不多,所以对于大多数应用程序,如果你打开一个文件,你不必调用 .close() (并使用丑陋的 try...finally 块),你会没事的 - finally() 会一段时间后为您免费。然而,对于某些代码片段(如密集的服务器应用程序),必须使用 .close() 释放资源,否则 finally() 可能调用得太晚,并且您可能会用完文件句柄。
Swing 使用相同的技术 - 用于显示窗口和绘图的操作系统资源不会由任何 .close() 方法释放,而只是由 finalize() 释放,因此您不必担心所有 .close() 或.dispose() 方法,例如 SWT 中的方法。
但是,当资源数量非常有限,或者您必须“锁定”资源才能使用它时,也要记得“解锁”它。例如,如果您在文件上创建文件锁,请记住还要删除此锁,否则其他人将无法读取或写入此文件,这可能导致死锁 - 然后您不能依赖 finalize() 删除这个锁适合您 - 您必须在正确的位置手动操作。