我有这样的代码(简化):
class A {
B b = new B();
void close() {
b.close();
}
}
class B {
Closeable mustBeClosed = new Closeable() {
{
System.out.println("create");
}
@Override
public void close() {
System.out.println("close");
}
};
int n = 0 / 0;
void close() {
mustBeClosed.close();
}
}
//code
try (A a = new A()) {
//do something
}
如何保证 mustBeClosed 被释放?
当对象层次结构复杂时,可能会发生这种情况。覆盖 B 的 finalize 可能不是一个完美的解决方案。
针对这个问题的任何最佳实践或原则?
修改后的版本如下:
class B {
Closeable mustBeClosed;
B() {
try {
mustBeClosed = ...
//other initialization which might raise exceptions
} catch (throwable t) {
close();
throw t;
}
}
void close() {
if (mustBeClosed != null) {
try {
mustBeClosed.close();
} catch (Throwable t) {
}
}
//all other resources that should be closed
}
}
然而,这需要太多的代码并且远非优雅。更重要的是,所有权层次结构中的所有类似乎都应该遵循相同的样式,这会导致大量代码。
有什么建议吗?