关于raii:是否可以在Java中实现C ++之类的资源管理

Is C++ like resource management possible in Java

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
{
    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等效的功能? 如果没有,请分享您在该领域的最佳做法(而不是最终的做法,除非使用了一些复杂的方法)。


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


Joshua Bloch提议将一种称为"自动资源管理"的机制添加到Java中,作为Project Coin的一部分(JDK 7的少量语言更改):


最接近的等效值为try/finally,请参见http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html


对于许多编码人员而言,RAII惯用语的优势在于,基础资源的寿命与作用域块绑定在一起,从而使事情的制作和维护更加简单; 最终减少了由于无法释放该资源而导致的错误。

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

1
2
3
4
5
6
7
8
9
10
// explicit release
MyClass obj = MyClass();
obj.UseIt();
obj.Dispose();

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

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