Java 尝试转让所有权

Java 尝试转让所有权,java,exception-handling,try-with-resources,Java,Exception Handling,Try With Resources,在Java7中,有一种try-with语法,可以确保像InputStream这样的对象在所有代码路径中都是关闭的,而不考虑异常。但是,try with块(“is”)中声明的变量是final try (InputStream is = new FileInputStream("1.txt")) { // do some stuff with "is" is.read(); // give "is" to another owner someObject.setSt

在Java7中,有一种try-with语法,可以确保像InputStream这样的对象在所有代码路径中都是关闭的,而不考虑异常。但是,try with块(“is”)中声明的变量是final

try (InputStream is = new FileInputStream("1.txt")) {
    // do some stuff with "is"
    is.read();

    // give "is" to another owner
    someObject.setStream(is);

    // release "is" from ownership: doesn't work because it is final
    is = null;
}
在Java中是否有简洁的语法来表达这一点?考虑这个异常不安全的方法。添加相关的try/catch/finally块将使该方法更加冗长

InputStream openTwoFiles(String first, String second)
{
    InputStream is1 = new FileInputStream("1.txt");

    // is1 is leaked on exception
    InputStream is2 = new FileInputStream("2.txt");

    // can't use try-with because it would close is1 and is2
    InputStream dual = new DualInputStream(is1, is2);
    return dual;
}

显然,我可以让调用者打开这两个文件,将它们都放在try-with块中。这只是我希望在将资源的所有权转移到另一个对象之前对其执行某些操作的一个示例。

使用try with的目的是在标识的资源决不能持久存在于try块的范围之外的情况下使用

如果要使用“尝试式”构造,必须按以下方式更改设计:

  • 删除
    openTwoFiles()
    方法。它是无价值的
  • 为采用两个文件名的
    DualInputStream
    类创建构造函数,并创建两个
    InputStreams
    。声明此构造函数抛出
    IOException
    ,并允许它抛出
    IOExceptions
  • 在try-with构造中使用新构造函数

  • 为什么需要发布
    is
    ?它专门用于try-block。try-with在您的情况下永远不会有帮助。try with旨在用于标识的资源决不能持久存在于try块范围之外的情况。这决不适用于您的情况openTwoFiles方法就是一个例子。如果我让DualInputStream构造函数接受文件名,那么在构造函数实现中我仍然会遇到所有异常安全问题。构造函数中没有异常安全问题。任何IOException都将删除构造函数,对象将被清除。您将无法在构造函数中捕获异常。这是不真实的。如果我在DIS构造函数中打开了两个InputStream,并且在打开第二个流时发生异常,那么第一个流将被泄漏,除非我编写了冗长的代码来处理该情况。