假设我有课 C
它包含需要作为成员变量关闭的资源。
public class C {
private ClosableResource1 closableResource1;
private ClosableResource2 closableResource2;
.....
public C(){
closableResource1 = new ClosableResource1();
closableResource2 = new ClosableResource2();
.....
// some logic that can fail
}
close(){
closableResource1.close()
closableResource2.close()
.....
}
}
如果构造函数成功了,我可以肯定 close()
最终将由某个实体管理器调用,所有资源都将被释放。但如何确保在构造函数失败时关闭资源?失败可能是因为我在构造函数中有额外的逻辑可以抛出异常,或者我得到了一些异常 RuntimeException
超出我的控制?
我想到的一些事情:
用一个 try-catch
阻止。那么,假设我有很多可关闭的成员,我就必须有一个大的 if
中的语句 catch
阻止检查哪些资源已经初始化并只关闭它们。
卸载 ClosableResource
对某些人来说这是创造 init()
功能。那我就得确定 init()
每次尝试使用对象时都成功。
有什么好办法吗?或者这比那更具体的实现?
2条答案
按热度按时间vnjpjtjt1#
您可以执行以下操作:
mrwjdhj32#
用try-catch包围代码并关闭catch中的所有资源是正确的解决方案。还可以阅读有关方法finalize()的内容(这里是一个教程)。一般来说,我会推荐一种清理所有资源的方法(就像您建议的方法一样)
close()
,不过我会叫它cleanup()
)在catch部分和finalize()
方法