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

Nakata Kouji [E-MAIL ADDRESS DELETED]
2007年 6月 26日 (火) 15:18:45 JST


なかたです。
返信ありがとうございます。

07/06/26 に Yasuo Higa<[E-MAIL ADDRESS DELETED]> さんは書きました:
> ひがです。
> > > >
> > > > うーん。そうなると Enum はバッチリですが、DB にString 以外で格納している
> > > > 場合のユーザ定義型データクラスをどうするか、が残っています。
> > > > 例えば今私のプロジェクトでいうと、権限レベルを int で管理しており、
> > > > 業務に割り当てられた権限レベルとユーザの権限レベルなどから計算によって、
> > > > 権限を持っているか判断しています。
> > > > 権限クラスを用意し、DBに格納された値を保持し、権限レベルに権限を有するか
>> > > > 判定メソッドを持っています。(判定機能を Authority クラスにカプセル化し
> たい)
> > > > Authority#valueOf(int) で権限クラスのインスタンスを生成し、
> > > > user.getAuthority().available(int) で判定するような形です。
> > > > データアクセスの結果 PropertyDescImpl#convertIfNeed に渡される arg は
> > > > int であるため、String のコンストラクタや valueOf(String)
> > > > を用意しても意味がありません。
> > >
> > > Authority#valueOf(String)も用意し、
> > > public static Authority valueOf(String arg) {
> > >  return valueOf(Integer.parseInt(arg));
> > > }
> > > のように実装するというのはいかがでしょうか。
> > > String#valueOf()もいろいろな型の引数に対応していますし、
> > > そんなに不自然なことはないと思います。
> >
> > ということは、コミットされた実装では、arg の型がなんだろうと、valueOf(String)
>> > 呼ばれるということでしょうか?私が示した次善策のような形なのでしょうか?
>
> arg の型がなんだろうと、valueOf(String)を呼び出す実装は
> まだ、いれていません。
> 仕様をもう少し議論する必要がありそうなので。

最新のソースを見ました。やはり arg が String の場合のみ valueOf が呼ばれる仕様ですね。Authority
クラスの値(int) は DB 上では integer とか number(2) とかで格納しているため、arg は Integer
となり、
Authority#valueOf(String) を用意しても呼ばれない、と思ったんですが、
> > > Authority#valueOf(String)も用意し、
> > > public static Authority valueOf(String arg) {
> > >  return valueOf(Integer.parseInt(arg));
> > > }
> > > のように実装するというのはいかがでしょうか。
とあったので、何か混乱してしまいました。

とりあえず、String 以外の型は何とかして String に変換して、
という主張をしているわけではありません。一応念のため。
#それぞれの型に応じた valueOf が呼ばれるのがいいと思っています。

> 最新の実装だと、Enumについては、データベースへの読み書きとも
> OKです。
>
> ユーザ定義型に対しては、valueOf(String)メソッドがあれば、
> データベースから読み込むことはできますが、データベースに
> 書き込むことはできません。
>
> 独自のValueTypeを登録していただければ、現状でも対応が
> 可能です。

はい。これはせとさんに教えていただきました。

> valueOf(...)の処理をがんばれば、カラムの値を
> ユーザ定義型のプロパティに変換することはできるのですが、
> ユーザ定義型のプロパティをカラムの値に変換するルールが
> 現状ではまだ決まっていません。
>
> もっとも単純なのは、ユーザ定義型のプロパティのtoString()を
> よびだしてカラムの値に変換することです。
>
> あるいは、value()ってインスタンスメソッドが定義されていれば、
> その戻り値をデータベースに格納するというルールにする
> こともできます。
> その場合は、valueOf()の引数の型は、value()の戻り値の型と
> 同じだとみなすことになるでしょう。
>
> public static Authority valueOf(int level) {
>   ...
> }
> public int value() {
>   ...
> }
> のような感じです。

これいいですね。物理値と論理値の相互変換をコンテナでしてくれると
大変うれしいです。



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