自从我使用Java以来已经有5年了,那时,每当您想分配需要清理的对象(例如套接字,DB句柄)时,都必须记住添加一个finally
块并在其中调用cleanup方法。那里。
相比之下,在C++(或确定对象生存期的其他语言,例如Perl)中,类实现程序将定义一个析构函数,该函数在该类的对象超出范围时执行清除。这种方法的优点是对象的用户不会忘记清理它-
即使抛出异常,析构函数也会被自动调用。这种方法用RAII的一个相当糟糕的名称命名为“资源获取正在初始化”。
根据我的经验,以“
RAII方式”做事为我节省了很多精神上的开销,而不必担心是否以及何时发生资源释放。我们正在考虑将Java用于一个中等规模的项目,并且我想知道自从我上次查看该语言以来,该语言添加的许多新功能中是否包括确定性破坏。我很希望在此线程上抱怨“ Java没有RAII”,但到目前为止,我无法通过谷歌搜索找到任何详细信息。)
因此,如果有人可以向我介绍一些有关如何在Java中进行此操作的入门资料,那就太好了!
编辑:以下答案写于2009年初,当时Java 7仍在不断发展。
尽管Java仍未提供有关最终确定时间的保证,但它 确实 获得了类似C#using
语句的功能:try-with-
resources语句
。
不,Java在这方面完全没有改变。您仍然需要使用try / finally。
已经讨论过在Java中添加等效的C#的“使用”语句(在try / finally上是语法糖),但是我认为这不再是Java
7的一部分。(大多数语言改进似乎已被放弃。)
值得理解的是,为什么没有在Java和.NET中以引用计数的垃圾收集器的形式实现确定性销毁,原因是-a)影响性能,b)循环引用失败。布莱恩·哈里(Brian
Harry)为此写了一封详细的电子邮件
-它是关于.NET的,它虽然很旧,但是值得仔细阅读。
如果我有一个启动程序脚本,我如何确定JVM是否支持模块(例如9+),以决定是使用还是脚本启动?
问题内容: 我想知道是否有任何方法可以在Java中实现。我认为,如果没有本地对闭包的支持,这是不可能的。 问题答案: Java 8(2014年3月18日发布)不支持curring。可以将Missingfaktor在答案中发布的示例Java代码重写为: …这是非常好的。就个人而言,有了Java 8,我几乎没有理由使用替代的JVM语言(例如Scala或Clojure)。当然,它们提供了其他语言功能,但
问题内容: Java是否有C ++的类似物: 我需要使用自己的数据类型。 问题答案: Java绝对没有结构:)但是,您在此处描述的内容看起来像JavaBean类。
根据维基百科关于子结构类型系统的文章,F*支持某种线性类型。这是真的吗?如果有,如何?我在F*教程中找不到任何关于它的信息。
问题内容: 我很困惑。我以为Java 8将会从石器时代诞生并开始支持lambda / closures。但是当我尝试这个: …说。恩,我想不是闭包。听起来好像是通过值而不是通过引用复制环境。 奖金问题! Android是否支持Java 8功能? 问题答案: 为什么,为什么,Java。为什么哦为什么。 您需要与相关的Oracle Java团队成员进行长时间的(私人)讨论,以获得真正的答案。(如果他们
问题内容: 我注意到,Metal L&F不支持Unicode中的某些箭头字符,而Nimbus和GTK L&F则支持它们。 不支持的字符仅显示为: 我可以吗 要么(手动)查找,L&F支持哪些Unicode字符, 还是在运行时找到它? 编辑: 或者,它应该仅取决于L&F的默认字体,我的问题也许应该是: “如何找出,哪种Java字体支持哪些Unicode字符?” 问题答案: 您可以使用该方法测试对象是否