在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中,人们不必打扰内存管理。但所有其他类型的资源仍然存在。有最终块,但它的使用非常不方便,特别是当可以抛出许多不同的异常时。
所以,我的问题是,是否有任何Java模式提供与C ++ RAII等效的功能?如果没有,请分享您在这个领域的最佳实践(而不是最终实践,除非它使用了一些复杂的方法)。
答案 0 :(得分:11)
您可以使用通常的acquire; try { use; } finally { release; }
。或者,您可以使用Execute Around idiom抽象资源处理。
答案 1 :(得分:4)
Joshua Bloch建议在Java中添加一个名为Automatic Resource Management的机制作为Project Coin的一部分(JDK 7的小语言更改):
答案 2 :(得分:3)
最近的等效值为try/finally
,请参阅http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html
答案 3 :(得分: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();
}
也许我们将来会看到这样的功能。