我是 Java 的新手,在高中时期有一些 C++ 背景。现在我想做点什么,我选择了 Java 作为编程语言。
我已经完成了我的家庭作业,并且看了很多关于 Java 的“析构函数”、finalize() 方法和close() 或 shutdown() 方法。但我仍然认为我不知道它应该如何工作(当然下面有更多信息)
好的,具体问题是为什么我需要调用close() 或shutdown() 方法?
在我的特殊情况下,我正在使用一个我没有开发的处理智能卡读卡器的类,但我已经看到文件管理的情况,你必须调用 close( ) 方法类似。
调用 close() 方法与在 C++ 中释放内存(那很糟糕)不是一样的想法吗?意思是,我必须处理对象的删除或销毁...不是 GC 吗?
这可能是我尝试用于智能卡读卡器的类不是最好的选项,这个类实现 finalize() 方法可能会更好,所以当不再使用并准备好进行 GC,释放内存(很可能是 native 代码)和/或释放 GC 可能不知道如何执行的硬件资源。
但是文件管理类呢?那些都非常常用和维护,为什么还需要一个close() 方法?我明白存在的目的,解锁文件,但为什么我要记得关闭它?一旦对象不再使用,则自动解锁文件,至少在最常见的情况下是这样。
最后,用实现 finalize() 方法的类包装需要关闭或关闭的类是否是一个合适的解决方法,我在那里调用 close() 或 shutdown() 方法?
我看到 finalize() 方法不是很流行,所以这就是为什么我要问这个问题应该如何解决。
提前致谢
胡安
PS:我看到的:
Is there a destructor for Java?
Why would you ever implement finalize()?
http://www.codeguru.com/java/tij/tij0051.shtml
最佳答案
大多数类会在它们的finalize
方法中清理它们的外部资源,但这与 C++ 的析构函数不同——一旦不再使用对象就会调用析构函数,但会调用终结器在对象被垃圾回收之前不会被调用,并且您不知道这将在何时发生(如果您没有内存密集型程序,它可能永远不会发生)。因此,假设您正在分配一堆对象,每个对象都分配一个数据库连接(是的,您应该使用连接池,但这是假设);你使用每个对象,然后清空它的引用,这样它就可以在不先关闭它们的数据库连接的情况下被垃圾收集,现在你的数据库会因为打开的连接太多而崩溃。您可以调用 System.gc
希望这会清理连接,但这只是对垃圾收集器执行收集的建议,并且您的垃圾数据库连接可能终结器不够智能,无法完全清理连接。
长话短说,您需要调用 close
和 shutdown
因为您不知道对象的终结器是否/何时运行,而您不知道不知道他们在清理外部资源方面有多好。
顺便说一句,您应该使用 try-catch-finally block 来确保调用 close
和 shutdown
- 将方法放在 finally block 中。或者,如果您使用的是 Java7,请使用 try-with-resources。
关于java - 为什么我需要调用 close() 或 shutdown() 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16070634/