[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 メーリングリストの案内