更新:正如@PaulGroke所指出的,Java7已经发生了变化:现在有了AutoCloseable。它不绑定到流,并得到新的试着用资源结构的支持。
AutoCloseable是与.NET的IDisposable接口直接等价的Java。
Java1.5中引入的Closeable接口与流紧密相连,甚至有一个IOException的异常说明符。这意味着它应该只用于流或其他与IO相关的活动,而不是一般用途的清理逻辑。
当然,对close()方法的描述在流/IO上下文之外绝对没有意义:
void close() throws IOException关闭此流并释放与其关联的任何系统资源。
因此,我是否应该声明我自己的接口Disposable,并在其上使用Dispose()方法,并将其用作.NET的IDisposable接口的模拟?或者我应该重复使用Closeable,即使它可能不是一个完美的匹配?
发布于 2013-03-16 02:47:31
我相信大多数人都知道这一点,但是由于这个问题在搜索"IDisposable Java“时仍然是最重要的问题之一(我刚才的结果是#2),所以这里仍然没有提到这个问题.
Java 7的情况发生了变化:现在有了AutoCloseable。它不绑定到流,并得到新的试着用资源结构的支持。
发布于 2016-04-20 10:49:30
在类中实现Closeable (或相应的AutoClosable )时,也可以省略抛出声明:
class X implements Closeable {
@Override public void close() /* I don't throw */ {
}
}因此,当某人使用类型化对象时,他们可以调用close(),而无需捕获任何内容:
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建议的那样:
try (X x = new X()) {
// do something
}但是,有一个罕见的警告:您不能在子类中重新引入该异常,一旦它被删除:
class Y extends X {
/* compile error */
@Override public void close() throws IOException {
// Y.close clashes with X.close: overridden method does not throw IOException
}
}https://stackoverflow.com/questions/1165428
复制相似问题