今日の「作ってみたけど微妙だった」
「ロックしてから処理をする機構を、タイプセーフな感じで」ということで、処理のインターフェイスとロツクメソッドを定義してみたわけですが。
/** * 処理 * @param <X> 戻り値の型 * @param <E1> 例外の型1 * @param <E2> 例外の型2 * @param <E3> 例外の型3 * @param <E4> 例外の型4 */ static interface Proc<X, E1 extends Throwable, E2 extends Throwable, E3 extends Throwable, E4 extends Throwable > { /** * 処理を実行する。 * @return 実行結果 * @throws E1 例外1 * @throws E2 例外2 * @throws E3 例外3 * @throws E4 例外4 */ X call() throws E1,E2,E3,E4; } ... /** * ロックしてから処理を実行する。 */ static <X,E1 extends Throwable, E2 extends Throwable, E3 extends Throwable, E4 extends Throwable> X lock( Proc<X,E1,E2,E3,E4> proc ) throws E1,E2, E3, E4 { try { // .. ロック return proc.call(); } finally { // .. ロック解放 } }
利用例。
// 例外を4種類スローする処理 lock ( new Proc<String, AAAException, BBBException, CCCException, DDDException>() { public String call() throws AAAException, BBBException, CCCException, DDDException { // ..処理 return ""; } }); // 例外を2種類スローする処理 lock ( new Proc<String, AAAException, BBBException, BBBException, BBBException>() { public String call() throws AAAException, BBBException { // ..処理 return ""; } });
んー。
- 例外をクラスの型パラメータとcallのthrowsの両方に並べるのがうっとうしいな。
- 実際には例外クラスの名前はもっと長くて、かなりの威圧感があった・・・。
- 例外が2個でいい場合も、クラスの型パラメータでは4つ書かないといかないのが何とも。
- 可変長型パラメータとかあればいいのかな?
まぁ、例外をいろいろ統廃合すればE2までに収まったので、そのまま使ったわけですが。