5

在 C++ 中,我们有资源获取即初始化(RAII) 模式,它极大地简化了资源管理。这个想法是为任何类型的资源提供一些包装对象。包装对象的析构函数然后负责释放资源,当它超出其范围时。例如:

{
    auto_ptr<int> smartPointer = new int;
    // some other code

} // the memory allocated for the int is released automatically
  // by smartPointer's destructor

最常见的用法是智能指针。但是,还有许多其他类型的资源(文件、互斥体、套接字等)可以以完全相同的方式进行管理。

在 Java 中,不必担心内存管理。但所有其他类型的资源仍然存在。有finally块,但是它的使用相当不方便,尤其是当可以抛出许多不同的异常时。

所以,我的问题是,是否有任何 Java 模式提供与 C++ RAII 等效的功能?如果没有,请分享您在该领域的最佳实践(而不是 finally,除非它使用了一些复杂的方式)。

4

4 回答 4

11

您可以使用通常的acquire; try { use; } finally { release; }. 或者,您可以使用Execute Around idiom抽象资源处理。

于 2009-03-26T18:06:36.963 回答
4

Joshua Bloch 提议在 Project Coin 中添加一个名为Automatic Resource Management的机制到 Java(JDK 7 的小语言更改):

于 2009-03-26T18:28:15.163 回答
3

最接近的等价物是try/finally,请参阅http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html

于 2009-03-26T18:03:40.557 回答
1

对于许多编码人员来说,RAII 习惯用法的优势在于,底层资源的生命周期与作用域块相关联,使事情更容易制作和维护;最终减少因未能释放该资源而导致的错误。

不幸的是,您无法在 Java 中模仿这种行为,因为您无法创建自己的范围绑定结构。尝试解决这个问题的一种类似于 Java 的语言是 C#:

// explicit release
MyClass obj = MyClass();
obj.UseIt();
obj.Dispose();

// RAII-like (scope-bound) release
using(MyClass obj = new MyClass())
{
    obj.UseIt();
}

也许我们将来会看到这样的功能。

于 2009-03-26T19:37:48.617 回答