Java中是不是可以进行类似C ++的资源管理[重复]

Posted

技术标签:

【中文标题】Java中是不是可以进行类似C ++的资源管理[重复]【英文标题】: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,除非它使用了一些复杂的方式)。

【问题讨论】:

看到这个问题:***.com/questions/194261/… 还有:***.com/questions/477399/… “大大简化了资源管理”你在开玩笑吗?? @hasen j:我不明白这个问题。 @hasen 不确定从源代码的角度来看,资源管理如何比 C++ RAII 简单得多... 【参考方案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:模拟“它”;范围?我的前额刚刚长了一英寸。

以上是关于Java中是不是可以进行类似C ++的资源管理[重复]的主要内容,如果未能解决你的问题,请参考以下文章

java 6 中自带的javaDB(derby)数据库,是不是不用启动服务,直接可以和jdk进行交互呀?

java jsoup 爬虫 怎么防止重复爬取

java中两个Double型数据可以用(>,<,==,>=,<=)进行比较吗? 请详细说明

Java语言中For循环算法是不是很占据CPU资源

Java ------常问的面试题

C 或 C++ 中是不是有一个函数可以对整数进行“饱和”