【问题标题】:Is C++ like resource management possible in Java [duplicate]Java中是否可以进行类似C ++的资源管理[重复]
【发布时间】:2010-10-15 18:33:03
【问题描述】:

在 C++ 中,我们有 Resource Acquisition Is Initialization (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,除非它使用了一些复杂的方式)。

【问题讨论】:

标签: java raii resource-management


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这只是 try/catch/finally 的(有用的)语法糖。因此,如果您想在今天(而不是 2011 年)完成某件事,请查看有关 try/catch/finally 的答案。
    • 除了 try/finally 与 RAII 相比很糟糕。最初的问题是 Java 是否有任何可以与 RAII 相媲美的东西,而答案显然是没有。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      对于许多编码人员来说,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();
      }
      

      也许我们将来会看到类似的功能实现。

      【讨论】:

      • python 也用with 构造添加了这个
      • 这不是真的。您当然可以按照 Tom Hawtin 的建议在 java 中模拟它 - tackline。
      • @Kirakun:模拟“它”;范围?我的前额刚刚长了一英寸。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2010-09-08
      • 2012-02-23
      相关资源
      最近更新 更多