8
try-with-resourcesブロックで複数のチェーンされたリソースを管理するためのイディオムを修正しますか?
Java 7のtry-with-resources構文(ARMブロック(自動リソース管理)とも呼ばれます)は、AutoCloseableリソースを1つだけ使用する場合に便利で短く、簡単です。ただし、相互に依存する複数のリソースを宣言する必要がある場合、たとえばa FileWriterとa BufferedWriterをラップすることで、正しいイディオムが何であるかわかりません。もちろん、この質問は、AutoCloseableこれら2つの特定のクラスだけでなく、いくつかのリソースがラップされた場合のすべてのケースに関係します。 私は次の3つの選択肢を思いつきました。 1) 私が見た単純なイディオムは、ARM管理変数で最上位のラッパーのみを宣言することです。 static void printToFile1(String text, File file) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(file))) { bw.write(text); } catch (IOException ex) { // handle ex } } これは素晴らしくて短いですが、壊れています。基になるFileWriter変数で宣言されていないため、生成されたfinallyブロックで直接閉じられることはありません。closeラッピングの方法でのみ閉じられBufferedWriterます。問題は、bwのコンストラクタから例外がスローされた場合、その例外がclose呼び出されないため、基にFileWriter なるものが閉じられないことです。 2) static void printToFile2(String text, File file) { try (FileWriter fw = new FileWriter(file); BufferedWriter …