2

私はJavaでデータベースを扱っており、次の行に沿って複数の関数を書いています

try {
    //acquire resources
}
finally {
    //release resources
}

Java の try-with-resources がこのような問題に対処する適切な方法であることは知っていますが、私は Java 6 を使用しています。コードの重複を減らす標準的な方法はありますか? リソース割り当て用に同じ try/finally ブロックを持ち、本体が異なる複数の関数をきれいに書く方法があればいいのにと思います。

私の現在の考えは、コンストラクターがリソースを取得するクラスの関数メンバーの本体を作成することでした。しかし、RAII がないと、まだ少し面倒です。

4

4 に答える 4

3

Guava (14.0+) を使用する余裕がある場合は、 を使用できますCloserすべての重複を排除するわけではありませんが、実装しているリソースを処理するための非常に便利な方法Closeableです。

final Closer closer = Closer.create();
final InputStream in1;
final InputStream in2; // whatever, as long as Closeable is implemented

try {
    in1 = closer.register(createIn1());
    in2 = closer.register(createIn2());
    // do stuff
} finally {
    closer.close();
}

このクラスは、すべてのリソースのクローズを適切に処理し、それらを登録したときとは逆の順序で処理します。

Guava を購入する余裕がない場合は、簡単なバージョンを自分でコーディングするのは非常に簡単です。

于 2013-07-01T20:53:45.427 に答える
1

Project Lombokを見てください。ボイラープレートを整理するために注釈処理を使用します。

より具体的には、@Cleanuptry...finallyアノテーションを使用すると、コンパイル時にラップインされます。

だからあなたのコードは

final Connection con...
try {
    //do stuff
} finally {
    con.close();
}

@Cleanup
final Connection con...

どちらも同じコードにコンパイルされます。

于 2013-07-01T21:05:27.540 に答える
1

アスペクトを使用できます。作業における側面の好例は、Springフレームワークです。そのように実現された機能の 1 つがトランザクション サポートです。トランザクションの側面は、トランザクションの開始、コミット (通常の処理の場合) またはロールバック (例外の場合)、および解放の処理です。

于 2013-07-01T21:07:35.687 に答える
0

Execute Around イディオムはまさにこのユース ケースを説明しているようです。「Execute Around」イディオムとは何ですか?

ただし、実装するのは少し面倒なようです

于 2013-07-01T20:54:00.377 に答える