Bean Inistialize

JavaでパラメータにBeanを使うことが多い。
理由はFind Bugsなどでパラメータが大杉だタコとテントウムシに指摘されるからだが・・・
中には
/**
* parametersNil
*/
class parametersNil {
/* empty */
}
という強者も、メソッドのパラメータが必須なツールを使う場合には必修である。
特にEJBの様なinterfaceやRedaer・Writerの様なパイプラインではBeanを使わない手は無い。
ただ、引き回している内に
Beanの中身に誰も関心を持たなくなり、
・誰かがパラメータをチェックしているだろうとかパラメータを使う奴がチェックするハズとか
・反動で1パスの度にゼンパラメータチェックとか
極端なことになりやすい。
さらにパイプラインの途中の処理がヒント情報(httpはTCPIP通信のプロトコルです など)を追加したいばかりに
parametersNil がめでたく、parameters1 になるのは良いとしても
parameters100をparameters101にするのは結構厄介だ。
そう、100個分のパラメータ・コピーをparameters101のコンストラクタに埋め込まないと厄介だからだ。
更にいつのまにかparameters100Α型(実は前段の処理が隠しプロパティが1つ追加した)になっていた場合、
Aの部分(前段の処理が追加した隠しプロパティ)が抜け落ちてしまう。このため、前段の処理の担当者は
Aの部分のパラメータ・コピーで埋める旅に出かける必要がある。
BeanUtils.copyPropertiesを使えば全てOKなんだけどね。

ConvertUtils.register(new IntegerConverter(null), Integer.class);
と設定してから使えばInteger(null)がnullのまま変換してくれるので、
ちょっと違った変換も可能。
というか、Strutsの中でもisNull判定(=設定なし)を使ってたらInteger(null)が0になって困った事態が発生したのだろう。
しかし、自前で頑張らず親のすねをかじる方針を立てれば、
最初の基底クラスに
void  XXbaseClass::Inistialize( XXbaseClass ) を実装しておけば
void XX::Inistialize(XX  object) {
// COPY ALL PROPERTIES
this.setter_baseProperty_1( object.getter_baseProperty_1() );
・・・
this.setter_baseProperty_N( object.getter_baseProperty_N() );

}

後の派生クラスは喜んでcopyLeft(my)を実装し、
void XX::Inistialize(XX  object) {
super.Inistialize(object);
/*
* 追加したプロパティだけコピー
*/
this.setter_1( object.getter_1() );
* ・・・
this.setter_N( object.getter_N() );

するハズだ。

そう、先導や誘導も時として重要なのである。
え?100個もプロパティがあったら大変だって?
そのBeanの Copy Constructer の中身を拝借すると
XX::XX( XX xx) {
   Inistialize(xx);
}
XX::Inistialize(XX xx) {
/*
* さっきまでXX::XX( XX xx)にあった処理
*/
}
で出来上がります。(大笑
でもこれってC++じゃ常套手段だったりするけどね。(大笑(大笑(大笑(大笑(大笑
そうつまりJavaの基底クラスを作ってる人って・・・ってことです。(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑(大笑
もちろんレビュワーも



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA