MyOpenedFile が、開かれたストリームでファイルをラップするものであると想像してください。次に、次のコードを想定します。
// method in an Util class
static void safeClose(MyOpenedFile f) {
if (f != null) {
try {
f.close();
} catch(IOException ex) { /* add logging or console output */ }
}
}
質問の実際の方法:
void doSomeFileOperation(...) throws IOException, ... {
MyOpenedFile f1 = null;
MyOpenedFile f2 = null;
try {
/* method's "business logic" code beings */
f1 = new MyOpenedFile(...);
//do stuff
f2 = new MyOpenedFile(...);
// do stuff
f1.close(); f1 = null;
// do stuff with f1 closed
f2.close(); f2 = null;
// do stuff with f2 closed
/* method's "business logic" code ends */
} finally {
Util.safeClose(f1); f1 = null;
Util.safeClose(f2); f2 = null;
}
}
現在、これは非常に面倒で、特にエラーが発生しやすくなっています (たとえば、finally ブロック内の一部のコードは、単体テストで呼び出すのが非常に難しい場合があります)。たとえば、C++ では、デストラクタがクリーンアップ (スコープ付きポインタ デストラクタによって呼び出されるか直接呼び出されるかのいずれか) を処理し、コードははるかにクリーンになります。
それで、ビジネスロジックコードの上にラップするためのより良い/より良い/よりクリーンな方法はありますf1
かf2
?
また、素敵なラッパーを提供する Apache Commons などのオープン ソース ライブラリを指す回答も歓迎します。