gpt4 book ai didi

java - Java 是否支持 RAII/确定性破坏?

转载 作者:IT老高 更新时间:2023-10-28 20:48:24 26 4
gpt4 key购买 nike

我使用 Java 已经至少 5 年了,那时,任何时候你想分配一个需要清理的对象(例如套接字、数据库句柄),你必须记住最后添加一个 阻塞并调用其中的清理方法。

相比之下,在 C++(或其他对象生命周期是确定性的语言,例如 Perl)中,类实现者将定义一个析构函数,该函数在该类的对象超出范围时执行清理。这种方法的优点是对象的用户不会忘记清理它——析构函数会自动调用,即使抛出异常也是如此。这种方法采用了相当糟糕的 RAII 名称——“资源获取即初始化”。

根据我的经验,“以 RAII 方式”做事为我节省了大量的精神开销,因为我不必担心是否以及何时会发生资源释放。我们正在考虑将 Java 用于一个中型项目,我想知道自从我上次查看 Java 以来添加到该语言的许多新特性中是否存在某种确定性破坏。 (我希望我的提示“Java 没有 RAII”被斥责了 on this thread,但到目前为止,我无法通过谷歌搜索找到任何细节。)

因此,如果有人可以向我指出一些关于如何在 Java 中进行此操作的介绍性 Material ,那就太好了!

最佳答案

编辑:下面的答案是在 2009 年初编写的,当时 Java 7 还在不断变化。

虽然 Java 仍然不提供有关完成时间的保证,但它确实获得了类似于 C# 的 using 语句的特性:try-with-resources statement .


不,Java 在这方面根本没有改变。你仍然需要使用 try/finally。

已经讨论过在 Java 中添加相当于 C# 的“using”语句(这是 try/finally 上的语法糖),但我认为这将不再是 Java 7 的一部分。 (大部分语言改进似乎已被放弃。)

值得理解的是,确定性销毁没有在 Java 和 .NET 中以引用计数垃圾收集器的形式实现是有原因的 - 顺便说一下 - a) 影响性能和 b) 由于循环引用而失败. Brian Harry 写了一个 detailed email关于这一点 - 它是关于 .NET 的,它相当古老,但值得仔细阅读。

关于java - Java 是否支持 RAII/确定性破坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/477399/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com