[Seasar-dev:243] Re: [S2Container] ToStringInterceptorコミットのお願い
Koichi Kobayashi
koichik
2006年 1月 13日 (金) 03:00:16 JST
小林 (koichik) です.
Date: Wed, 11 Jan 2006 22:21:19 +0900
From: 江里口 温 <on-eri @ vega.ocn.ne.jp>
To: seasar-dev @ lists.sourceforge.jp
Subject: [Seasar-dev:239] [S2Container] ToStringInterceptorコミットのお願い
> ToStringInterceptorができましたので、リポジトリにコミットして
> いただけないでしょうか。
軽く拝見しました.いくつか気になる点が...
1.スーパークラスのフィールドが表示されない.
Class#getDeclaredFields() は当該クラスに定義されたフィールドしか
返してくれません.
Class#getFields() を使うとスーパークラスのフィールドも
返してくれますが,public なフィールドしか返してくれません.
なので,クラス階層をたどりながら Class#getDeclaredFields() を
使うしかないかな,と.
2.setAccesible(boolean) について.
private なフィールドも扱うために
boolean isAccesible = field.isAccessible();
field.setAccessible(true);
(略)
field.setAccessible(isAccesible);
としていますが,最後の setAccessible(isAccesible) は
外しちゃってください.
理由は IBM JDK1.4.1 では一度 setAccessible(false) すると
それ以降 setAccessible(true) しても効果がなくなってしまうためです.
その他,以下に書いたような悩ましい問題もあります.
http://d.hatena.ne.jp/koichik/20050326/1111867221
3.フィールド全体を角括弧で囲んで欲しい
細かいことなのですが,Commons Lang の ToStringBuilder だと
FooEntity @ f72617[intVal=12,longVal=123]
のように,フィールド全体を角括弧で囲んでくれます.
ToStringInterceptor でも同じようにして頂けないでしょうか.
class Bar {
private char charVal;
private Foo foo;
private String stringVal;
...
}
なんて場合に,Foo と Bar 両方に ToStringInterceptor が適用されると,
現在のままだと
Bar @ abcd,charVal=a,foo=Foo @ dada,intVal=12,longVal=123,stringVal=hoge
みたいになってしまい,どこまでが Foo のフィールドか分かりにくい
気がします.
Commons Lang 風だとちょっとだけマシに.
Bar @ abcd[charVal=a,foo=Foo @ dada[intVal=12,longVal=123],stringVal=hoge]
これでもそんなにわかりやすいとは思えませんが (苦笑),
ないよりはいいかな,と.(^^;
個人的には char や String は ' とか " で囲んで欲しかったりしますが,
Commons Lang の ToStringBuilder がそうしてないからこれはいいか...
--
<signature>
<name>Koichi Kobayashi</name>
<e-mail>koichik @ improvement.jp</e-mail>
</signature>
seasar-dev メーリングリストの案内