对于用户代码,有几个选项可以正确关闭多个资源:
1.尝试资源
try (
A a = new A();
B b = new B();
C c = new C()
) {
// ...
}
除了好又短,它也是正确的.
2.番石榴更接近
对于JDK7之前的版本,有一个Guava的Closer,用途如下:
Closer closer = Closer.create();
try {
A a = closer.register(new A());
B b = closer.register(new B());
C c = closer.register(new C());
// ...
} catch (Throwable e) { // must catch Throwable
throw closer.rethrow(e);
} finally {
closer.close();
}
拥有多个资源的对象怎么样?
说我有:
public class P implements AutoCloseable {
private A a;
private B b;
private C c;
public P() {
a = new A();
b = new B();
c = new C();
}
public close() {
c.close();
b.close();
a.close();
}
}
此代码存在多个问题:
>如果从构造函数抛出异常,则不会关闭任何内容(调用者没有要调用的实例关闭)
>如果从关闭引发异常,则不会关闭某些资源
1和2都没有遇到这些问题.然而:
>尝试资源显然不能使用,因为P的生命周期由调用者控制
> Guava Closer似乎也无法使用.虽然它更灵活,但它不支持close-and-rethrow,这是构造函数所必需的
没有太多样板的N资源的正确模式是什么?该解决方案还应具有1和2的抑制属性