【发布时间】:2010-10-03 09:45:43
【问题描述】:
我使用 Java 已经至少 5 年了,那时,任何时候你想分配一个需要清理的对象(例如套接字、数据库句柄),你必须记得添加一个 finally 块并在那里调用清理方法。
相比之下,在 C++(或其他对象生命周期是确定性的语言,例如 Perl)中,类实现者将定义一个析构函数,该函数在该类的对象超出范围时执行清理。这种方法的优点是对象的用户不会忘记清理它——析构函数会自动调用,即使抛出异常也是如此。这种方法采用了相当糟糕的 RAII 名称——“资源获取即初始化”。
根据我的经验,“以 RAII 方式”做事为我节省了很多精神开销,因为我不必担心是否以及何时会发生资源释放。我们正在考虑将 Java 用于一个中型项目,我想知道自从我上次查看 Java 以来添加到该语言的许多新特性中是否存在某种确定性破坏。 (我希望我的抱怨“Java 没有 RAII”被斥责on this thread,但到目前为止,我无法通过谷歌搜索找到任何细节。)
因此,如果有人可以向我指出一些关于如何在 Java 中进行此操作的介绍性材料,那就太好了!
【问题讨论】:
-
@Raedwald:虽然我的问题实际上与您所链接的问题本质上是重复的,但我注意到对该问题的最高投票和接受的答案声称,因为 Java 使用 GC,它 不能具有确定性破坏。但是在这里 Jon Skeet 的回答下的 cmets 表明这两件事并不矛盾,我认为这很有趣和有用。 (当然,这可能只是我的自私自利 ;-)