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等效的功能? 如果没有,请分享您在该领域的最佳做法(而不是最终的做法,除非使用了一些复杂的方法)。
您可以使用通常的
Joshua Bloch提议将一种称为"自动资源管理"的机制添加到Java中,作为Project Coin的一部分(JDK 7的少量语言更改):
最接近的等效值为
对于许多编码人员而言,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(); } |
也许将来我们会看到这样的功能。