【问题标题】:Array or collection of "Autocloseable" in Java8Java8中“Autocloseable”的数组或集合
【发布时间】:2017-04-22 08:37:06
【问题描述】:

Autocloseable 应始终与try-with-resources 一起使用。至少 Intellij 检查表明了这一点。 所以,如果我有一个产生Foo 的代码实现Autocloseable 我应该这样做:

try (final Foo foo = getFoo()) {
    foo.doSomething();
}

但是如果我有返回Foo[] 的函数呢?或者接受Foo[](或Collection<Foo>)作为其参数的函数?

如何将它与try-with-resources 一起使用? 看以下函数:

Foo[] getFoos();
doAll(Foo... foo);

我想做点事doAll(getFoos())

我该怎么做?

【问题讨论】:

    标签: java java-8 try-with-resources autocloseable


    【解决方案1】:

    Try-with-resources 语句只能关闭那些在其标头中声明和分配的资源。所以唯一的方法是让你得到的 Collection 实现 AutoCloseable 或将它包装到你的 AutoCloseable 扩展中,所以它的 close() 方法将被 T-W-R 调用。喜欢:

    try (SomeAutoCloseableCollction col = getAutoCloseables()) {
            System.out.println("work");
    }  //col.close() gets called
    

    对于一个数组,恐怕没有办法,因为你不能扩展它,让它实现一些接口。


    如果您要自己关闭集合,可以查看 Apache Drill 项目和类 org.apache.drill.common.AutoCloseables - 它就是这样做的,它会自行关闭许多 AutoCloseables。

    【讨论】:

      【解决方案2】:

      您可以创建方法将AutoCloseables 组合成一个可以安全地关闭所有它们的方法:

      public static AutoCloseable closeBoth(AutoCloseable a, AutoCloseable b) {
          if(a==null) return b;
          if(b==null) return a;
          return () -> { try(AutoCloseable first=a) { b.close(); } };
      }
      public static AutoCloseable closeAll(AutoCloseable... c) {
          return Arrays.stream(c).reduce(null, MyClass::closeBoth);
      }
      

      他们允许使用数组返回方法,如

      Foo[] foo;
      try(AutoCloseable closeAll = MyClass.closeAll(foo=getFoos())) {
          /*
              use foo
          */
      }
      

      【讨论】:

        【解决方案3】:

        正如另一个答案所说,这实际上是不可能的。但是,您应该问自己为什么需要将整个集合放在 AutoCloseable 中。如果您想确保每个元素在处理后关闭,您可以执行以下操作:

        Foo[] foos = getFoos();
        for (int i = 0; i < foos.length; i++) {
          try (Foo foo = foos[i]) {
            // Your code here
          }
        }
        

        【讨论】:

        • 我找不到使用增强的 for 循环使其工作的方法,但如果有人确实看到了方法,请通过编辑更新我的答案。
        • 你的意思是for(Foo foo: getFoos()) try(Foo toClose=foo) { /* code */ }?那应该可以。
        • AutoCloseables 集合用例:写入数组中的分片文件。
        猜你喜欢
        • 2018-06-29
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 2011-02-10
        • 1970-01-01
        • 2012-10-19
        • 2014-05-17
        相关资源
        最近更新 更多