关闭不可访问的资源

de90aj5v  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(693)

如何以正确的方式管理资源的状态?
在java中,有时我们需要像这样打开和关闭资源

Scanner sc = new Scanner(File);
sc.close();

在复杂的场景中并不是那么容易。
我正面临这个问题

foo(){
  return new ClosableResourse();
}

bar(ClosableResourse foo){
  return new NotAccesibleFoo(foo);
}

两个实体使用这个 NotAccesibleFoo . 我怎样才能正确地关闭我的 ClosableResource 上课?
bar()函数是唯一可以关闭它的地方,但在其他实体中是必需的,不能从它们访问。

5f0d552i

5f0d552i1#

这里的工作示例
考虑一下java的try with resources特性,下面的示例:

public class Example {
    public static void main(String[] args) {
        try (Bar b = new Bar()) {
            b.bar();
        }
    }
}

这里,如果 Bar 实现自动关闭,然后 close() 自动调用。这可能与您的问题代码不完全匹配,但您可以 close() 像这样:

class CloseableResource implements AutoCloseable {
    @Override
    public void close() {
        System.out.println("TRACER CR close");
    }
}

class Foo implements AutoCloseable {
    CloseableResource resource = new CloseableResource();

    @Override
    public void close() {
        System.out.println("TRACER Foo close");
        resource.close();
    }
}

class Bar implements AutoCloseable {
    Foo foo = new Foo();

    void bar() {} 

    @Override
    public void close() {
        System.out.println("TRACER Bar close");
        foo.close();
    }
}

在这种情况下,客户机代码(例如 Example.java 这里)使用try with resources模式。

相关问题