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 ブロックに入れることができます。これは、リソースの所有権を別のオブジェクトに譲渡する前に、リソースに対して何らかの操作を実行したい場合のほんの一例です。