AutoCloseableっぽい方法が、唯一の難点上で実行

Arkadiusz:


二つの異なる方法で実行されている必要があり、私は2つに希望catchしてfinalブロックを。私が発見したAutoCloseableインターフェイスを、私は唯一の例外の場合、火災に何かを必要とします。
お気に入り:

SomeService service = CreateService().andOpenTransaction()

try {
    service.doSomeMessyThingsInsideDB();
} catch (Exception e) {
    service.rollbackTransaction();
    throw e;
} finally {
    service.closeConnection();
}

それを簡単にする方法はありますか?私が言ったように私はAutoCloseableに精通していますが、それが唯一のfinallyブロックで私を支援します。私はまだキャッチ内で使用することはできません。

リノ:

さてあなたは、独自のインタフェースを定義し、いくつかの可能性がstaticランナー方法:

public interface ErrorHandlingCloseable extends AutoCloseable {
     void run() throws Exception;
     void onError(Exception e);

     static void execute(ErrorHandlingClosable ehc) throws Exception {
         try(ErrorHandlingClosable temp = ehc) {
             ehc.run();
         } catch(Exception e) {
             ehc.onError(e);
             throw e;
         }
     }
}

これはあなたがして、このように呼び出すことができます。

SomeService service = CreateService().andOpenTransaction();
ErrorHandlingCloseable.execute(new ErrorHandlingCloseable() {
    public void run() throws Exception { service.doSomeMessyThingsInsideDB(); }
    public void onError(Exception e) { service.rollbackTransaction(); }
    public void close() throws Exception { service.closeConnection(); }
});

しかし、あなたは、それはまだ厄介だ参照してください。

あなたも、これを実装することができinterface、あなたの中でSomeServiceはなく、あなたがすることを制限されているrun()メソッドは常に呼び出しますdoSomeMessyThingsInsideDB()


もう一つの方法が、それでも同様のはJava8を使用して、機能ヘルパーを作成することですinterface

public interface ThrowingRunnable {
   void run() throws Exception;
}

そして、staticメソッドのどこか:

public static void execute(ThrowingRunnable action,
                           ThrowingRunnable onCatch,
                           ThrowingRunnable onFinally) throws Exception {
   try(AutoCloseable ao = onFinally) {
       action.run();
   } catch(Exception e) {
       onCatch.run();
       throw e;
   }
}

興味深い部分は、おそらくこれである:try(AutoCloseable ao = onFinally)あなたのある「登録する」onFinally際にメソッドが呼ばれるようにfinally達しています。

これは、このように呼ばれることができます:

execute(
    service::doSomeMessyThingsInsideDB, 
    service::rollbackTransaction, 
    service::closeConnection
);

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=478541&siteId=1