【问题标题】:Helper to call close() if implements AutoCloseable?如果实现 AutoCloseable,帮助调用 close()?
【发布时间】:2014-05-01 00:54:51
【问题描述】:

JDK 或通用库中是否有任何辅助方法可以做到这一点:

if (resource instanceof AutoCloseable) {
    ((AutoCloseable) resource).close();
}

如果适用,只需一条线即可调用对象的close()

我知道 try-with-resources,它不适用于这种情况。而且我知道并非所有具有close() 方法的类都实现AutoCloseable。但是,我似乎一遍又一遍地写上面的内容..

【问题讨论】:

  • 这看起来像是 XY 问题。您能详细介绍一下上下文吗?你不应该使用instanceof
  • fge: 是的,需要澄清一下:我有一个接口的引用,在编译时我不知道 impl 除了接口之外是否还实现了 AutoCloseable。
  • 嗯,是的,你可以:public <T extends YourInterface & AutoCloseable> void doSomethingWith(T victim)
  • 这将限制为 AutoCloseable impls;我正在寻找“..调用对象​​的 close() 如果适用”。
  • 这看起来根本不对。这种方法存在根本性的问题,您应该更多地解释您的问题。

标签: java autocloseable


【解决方案1】:

这里是适用于 AutoCloseable 的 apache commons closeQuietly

  static void closeQuietly(AutoCloseable closeable) {
    try {
      if (closeable != null) {
        closeable.close();
      }
    }
    catch (Exception swallowed) {
    }
  }

因为谷歌为了那个案子把我派到这里:)

【讨论】:

    【解决方案2】:

    编辑

    检查一下:

    class CloserHelper
    {
        public static void close(Object object)
        {
            if (object instanceof AutoCloseable)
            {
                try
                {
                    ((AutoCloseable) object).close();
                }
                catch (Exception ignored) { }
            }
        }
    }
    

    我能想到这样的事情

    class CloserHelper
    {
        public static void close(AutoCloseable obj) throws Exception
        {
            obj.close();
        }
    }
    

    然后

    CloserHelper.close(resource);
    

    如果对象不是AutoCloseable,则不能直接调用它


    如果你想忽略异常

    class CloserHelper
    {
        public static void close(AutoCloseable obj)
        {
            try
            {
                obj.close();
            }
            catch (Exception e) { }
        }
    }
    

    【讨论】:

    • Marco:我有一个接口的引用,在编译时我不知道 impl 除了接口之外是否还实现了 AutoCloseable。
    • catch (Exception e) NullPointerEception。
    • @fge 是的,我的代码想要忽略所有异常。无论如何 instanceof 将避免 null 所以没有 NullPointerException
    【解决方案3】:

    【讨论】:

    • 没有帮助。一方面,不要求AutoCloseable 也实现Closeable。其次,与 Guava 的 Closer 相比,此实用程序相形见绌。
    猜你喜欢
    • 2012-10-19
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多