[seasar-dev:1193] Re: S2Util

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2010年 8月 23日 (月) 22:00:00 JST


小林 (koichik) です.

例外クラスを org.seasar.util パッケージに移動しました.

例外クラスのいくつかは MessageFormatter を利用して
メッセージを組み立てるため,

SRuntimeException(String messageCode, Object[] args)

のようなコンストラクタを持っていたのですが,
これを可変長配列に修正しました.

SRuntimeException(String messageCode, Object... args)

そうすると,原因となった例外を受け取るコンストラクタ

SRuntimeException(String messageCode, Object[] args, Throwable cause)

の扱いに困ったので,このコンストラクタは【削除】
しました.

throw new SRuntimeException("EUTL0000", a, b).initCause(e);

とすればいいかなと.
ただ initCause() の戻り値型は Throwable なので,
(checked な例外の場合) そのままだとキャストが
必要になってしまうので,共変な戻り値型のメソッド

@Override
public SRuntimeException initCause(Throwable cause) {
    return (SRuntimeException) super.initCause(cause);
}

を定義しました.

これでキャストも不要♪
...
って喜んでいいのか微妙.
そこまでして可変長引数にすべきだったのか?
という疑問が残ります.

利用するコードを比べると,

Seasar2
throw new SRuntimeException("EUTL0000", new Object[] {a, b}, e);

S2Util
throw new SRuntimeException("EUTL0000", a, b).initCause(e);

メッセージに例外を含める場合は

Seasar2
throw new SRuntimeException("EUTL0000", new Object[] {a, b, e}, e);

S2Util
throw new SRuntimeException("EUTL0000", a, b, e).initCause(e);

悪くはない...のか?
どう思いますか?


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-dev メーリングリストの案内