所以我已经阅读了关于autocloseable接口的所有内容并尝试使用资源,但这让我感到奇怪:
如果我没有(忘记)在使用该类的代码中尝试使用资源尝试包装实现AutoCloseable的类会发生什么,但该类确实从操作系统获取资源? 虽然不能保证JVM何时会决定调用它的垃圾收集器,但是当它调用它时,是否会调用close()方法?
如果没有,这是否会让我想念C ++的析构函数? :) 有没有类似的方法来确保从该类的代码而不是用户的代码中,一旦该对象应该被释放(例如超出范围),它将释放所有的OS资源已经采取了?
答案 0 :(得分:3)
取决于课程。有些人实现了在GC收集对象时调用的finalize()
方法,并且调用了close();
,但它无法保证。
请注意,虽然你可能会想到#ye; yeehaw,但Java确实有析构函数!"它不是一回事,并且你不建议你开始在你自己的课程中实现finalize()
(我记不起在我16年的Java编程中写一篇)。
当您忘记关闭资源时,您已经犯了错误,所以要修改它。使用AutoCloseable
它比过去更方便。
答案 1 :(得分:1)
您无需添加任何此类文档。只需将其设为Closeable
或Autocloseable
,每个人都会知道。最多,在用于获取实例的方法/构造函数中添加一条简短的注释“不要忘记调用close()
”。
如果没有,这是否会让我想念C ++的析构函数?
当然,你会想念他们。 Java中没有真正的替代品。 finalize()
和朋友们相当无法使用。在GC启动之前,您可能已经耗尽资源(文件描述符或类似文件)。
您可以使用finalize()
或类似内容来打印警告。如果对象在没有被关闭之前得到了GC,那就是资源泄漏。
有静态分析工具可以标记非封闭资源。不知道,如果他们使用自定义对象,但我敢打赌,他们会查看实现(自动)可关闭的所有类。