关闭在失败构造函数中创建的资源

ryevplcw  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(300)

假设我有课 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() 每次尝试使用对象时都成功。
有什么好办法吗?或者这比那更具体的实现?

vnjpjtjt

vnjpjtjt1#

您可以执行以下操作:

public class C {
    private List<AutoCloseable> closableResources = new ArrayList();
    private ClosableResource1 closableResource1;
    private ClosableResource2 closableResource2;
    .....

    public C() {
        closableResource1 = new ClosableResource1();
        closableResources.add(closableResource1)
        closableResource2 = new ClosableResource2();
        closableResources.add(closableResource2);
        .....
        try {
            // some logic that can fail
        } catch(Exception e) {
            close();
        }
    }

    close(){
        for (AutoCloseable closableResource : closableResources) {
            if (closableResource != null) {
                closableResource.close();
            }
        }
    }
}
mrwjdhj3

mrwjdhj32#

用try-catch包围代码并关闭catch中的所有资源是正确的解决方案。还可以阅读有关方法finalize()的内容(这里是一个教程)。一般来说,我会推荐一种清理所有资源的方法(就像您建议的方法一样) close() ,不过我会叫它 cleanup() )在catch部分和 finalize() 方法

相关问题