2

Java 7 には、例外に関係なく、すべてのコード パスで InputStream のようなオブジェクトが確実に閉じられるようにする try-with 構文があります。ただし、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 ブロックに入れることができます。これは、リソースの所有権を別のオブジェクトに譲渡する前に、リソースに対して何らかの操作を実行したい場合のほんの一例です。

4

1 に答える 1

1

try-with は、識別されたリソースが try ブロックの範囲外に永続化してはならない状況で使用することを目的としています。

try-with 構成を使用する場合は、次のように設計を変更する必要があります。

  1. メソッドを削除しopenTwoFiles()ます。それは無価値です。
  2. DualInputStream2 つのファイル名を取り、2 つの を作成するクラスのコンストラクターを作成しますInputStreams。このコンストラクターがスローすることを宣言し、スローIOExceptionできるようにしIOExceptionsます。
  3. try-with コンストラクトで new コンストラクターを使用します。
于 2014-05-30T21:58:46.073 に答える