首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭应否用作.NET的IDisposable的Java等效项?

关闭应否用作.NET的IDisposable的Java等效项?
EN

Stack Overflow用户
提问于 2009-07-22 13:53:28
回答 2查看 17.7K关注 0票数 30

更新:正如@PaulGroke所指出的,Java7已经发生了变化:现在有了AutoCloseable。它不绑定到流,并得到新的试着用资源结构的支持。

AutoCloseable是与.NET的IDisposable接口直接等价的Java。

Java1.5中引入的Closeable接口与流紧密相连,甚至有一个IOException的异常说明符。这意味着它应该只用于流或其他与IO相关的活动,而不是一般用途的清理逻辑。

当然,对close()方法的描述在流/IO上下文之外绝对没有意义:

void close() throws IOException 关闭此流并释放与其关联的任何系统资源。

因此,我是否应该声明我自己的接口Disposable,并在其上使用Dispose()方法,并将其用作.NET的IDisposable接口的模拟?或者我应该重复使用Closeable,即使它可能不是一个完美的匹配?

EN

回答 2

Stack Overflow用户

发布于 2013-03-16 02:47:31

我相信大多数人都知道这一点,但是由于这个问题在搜索"IDisposable Java“时仍然是最重要的问题之一(我刚才的结果是#2),所以这里仍然没有提到这个问题.

Java 7的情况发生了变化:现在有了AutoCloseable。它不绑定到流,并得到新的试着用资源结构的支持。

票数 46
EN

Stack Overflow用户

发布于 2016-04-20 10:49:30

在类中实现Closeable (或相应的AutoClosable )时,也可以省略抛出声明:

代码语言:javascript
复制
class X implements Closeable {
    @Override public void close() /* I don't throw */ {

    }
}

因此,当某人使用类型化对象时,他们可以调用close(),而无需捕获任何内容:

代码语言:javascript
复制
void f() { // notice no need for throws because close() doesn't throw
    X x = new X();
    try {
        // do something
    } finally {
        x.close();
    }
}

它也兼容任何期望Closeable的东西:如果这个对象被传递到处理Closeable的某个地方,那么他们已经预见到一个异常并正确地处理它,尽管在这种情况下是徒劳的。

这包括像Closeables和Java7这样的库,如Paul建议的那样:

代码语言:javascript
复制
try (X x = new X()) {
    // do something
}

但是,有一个罕见的警告:您不能在子类中重新引入该异常,一旦它被删除:

代码语言:javascript
复制
class Y extends X {
                                  /* compile error */
    @Override public void close() throws IOException {
        // Y.close clashes with X.close: overridden method does not throw IOException
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1165428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档