[Seasar-user:8662] Re: [S2Dao] Bean のプロパティに基本型以外を使う方法

Nakata Kouji [E-MAIL ADDRESS DELETED]
2007年 6月 25日 (月) 23:11:31 JST


なかたです。
対応ありがとうございます。

07/06/25 に Yasuo Higa<[E-MAIL ADDRESS DELETED]> さんは書きました:
> ひがです。
>
> > なかたです。
> >
> > org.seasar.framework.beans.impl.PropertyDescImpl クラスを改造
> > してみました。
> > これで、Enum クラスに対応でき、また、DBに格納したデータが
> > String 以外の場合にも、その型に適合した
> > static valueOf メソッドを用意しておくとそのインスタンスを生成して
> > 設定します。
> > #実行効率を無視して組んだので、遅いと思いますが。
> >
> ありがとうございます。
> ただ、実際のコミットしたコードは、効率も重視し
> valueOf(String)だけにメソッドを絞り、最初にキャッシュするように
> なっています。
>
> よろしくお願いします。

うーん。そうなると Enum はバッチリですが、DB にString 以外で格納している
場合のユーザ定義型データクラスをどうするか、が残っています。
例えば今私のプロジェクトでいうと、権限レベルを int で管理しており、
業務に割り当てられた権限レベルとユーザの権限レベルなどから計算によって、
権限を持っているか判断しています。
権限クラスを用意し、DBに格納された値を保持し、権限レベルに権限を有するかの
判定メソッドを持っています。(判定機能を Authority クラスにカプセル化したい)
Authority#valueOf(int) で権限クラスのインスタンスを生成し、
user.getAuthority().available(int) で判定するような形です。
データアクセスの結果 PropertyDescImpl#convertIfNeed に渡される arg は
int であるため、String のコンストラクタや valueOf(String)
を用意しても意味がありません。
この場合どうしたものか、ちょっと考えあぐねております。

先ほど私が送ったように、valueOf の引数の型をStringに限定しない、というのが理想です。
#valueOf メソッドを引数の型でマップしてキャッシュする、とか。

次善策としては、PropertyDescImpl で valueOf のところで、
if (arg instanceof String) {
  Method.invoke(valueOfMethod, ???,arg);
} else {
  Method.invoke(valueOfMethod, ???, String.valueOf(arg));
  // もしくは Method.invoke(valueOfMethod, ???, arg.toString());
}
というようにString にしてしまう、という方法。
#副作用がちょっと怖いですが。

これができると、Dao が返したエンティティがすぐさまビジネスロジックから利用可能という
理想的な状態になるのでちょっと食い下がっております。
もしかしたら、エンティティの設計に問題があるのかもしれませんが、
ぜひアドバイスを頂けたらと思います。
よろしくお願いします。



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