自从我使用Java以来已经有5年了,那时,每当您想分配需要清理的对象(例如套接字,DB句柄)时,都必须记住添加一个finally块并在其中调用cleanup方法。那里。
finally
相比之下,在C++(或确定对象生存期的其他语言,例如Perl)中,类实现程序将定义一个析构函数,该函数在该类的对象超出范围时执行清除。这种方法的优点是对象的用户不会忘记清理它- 即使抛出异常,析构函数也会被自动调用。这种方法用RAII的一个相当糟糕的名称命名为“资源获取正在初始化”。
根据我的经验,以“ RAII方式”做事为我节省了很多精神上的开销,而不必担心是否以及何时发生资源释放。我们正在考虑将Java用于一个中等规模的项目,并且我想知道自从我上次查看该语言以来,该语言添加的许多新功能中是否包括确定性破坏。我很希望在此线程上抱怨“ Java没有RAII”,但到目前为止,我无法通过谷歌搜索找到任何详细信息。)
因此,如果有人可以向我介绍一些有关如何在Java中进行此操作的入门资料,那就太好了!
编辑:以下答案写于2009年初,当时Java 7仍在不断发展。
尽管Java仍未提供有关最终确定时间的保证,但它 确实 获得了类似C#using语句的功能:try-with- resources语句。
using
不,Java在这方面完全没有改变。您仍然需要使用try / finally。
已经讨论过在Java中添加等效的C#的“使用”语句(在try / finally上是语法糖),但是我认为这不再是Java 7的一部分。(大多数语言改进似乎已被放弃。)
值得理解的是,为什么没有在Java和.NET中以引用计数的垃圾收集器的形式实现确定性销毁,原因是-a)影响性能,b)循环引用失败。布莱恩·哈里(Brian Harry)为此写了一封详细的电子邮件 -它是关于.NET的,它虽然很旧,但是值得仔细阅读。