[Seasar-user:15004] Re: [Teeda] forEachで表示する際、getterが3回動く理由について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 7月 11日 (金) 17:00:25 JST


小林 (koichik) です.

Date:    Fri, 11 Jul 2008 09:37:52 +0900
From:    木村 究道 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:14994] [Teeda] forEachで表示する際、getterが3回動く理由について

> forEachを使用して表示する際に、各フィールドの
> getterが1行表示ごとに、3回ずつ動いているようなの
> ですが、それぞれの役割を教えていただけないでしょ
> うか?

例えば次のような Dto と Page クラスがあった場合,

public class FooDto {
  public String bar;
}

public class FooPage {
  public FooDto[] fooItems;
  public String bar;
}

forEach は繰り返しごとに次の処理を行います.

1.現在の bar の値を保存.
2. fooItems[n].bar を bar に設定.
3.繰り返し内のコンポーネントを処理.
4. bar の値を fooItems[n].bar に設定.
5.1.で保存した値を bar に設定.

1.および 4.で bar の値が参照されます.
getter でアクセスされる場合は getBar() が
呼ばれます.
2.および 5.で bar に値が設定されます.
setter でアクセスされる場合は setBar() が
呼ばれます.

繰り返しの中で outputText が使われていたり
すると,3.のところで bar の値が参照されます.

そんなわけで (どんなわけで?),

1.現在 bar の値を退避するため.
2.画面に表示するため.
3.fooItems[n] の bar に反映するため.

の都合 3 回 bar の値が参照されます.

> 行番号の最大値は、forEachで出力後のxxxIndexの値が
> 最大値になっていると思い、forEachの記述の後に隠し
> フィールドを仕込んでそこにxxxIndexを出力して見た
> のですが、初期値しか出力されませんでした。

forEach の処理後,xxxIndex は繰り返し処理を
行う前の値に戻します.
xxxIndex に繰り返しのインデックスが設定されるのは,
繰り返しの中だけです.
先の例での bar も同じですが,Teeda で設定した
プロパティの多く (xxxItems を除く) は繰り返し前の
値を復元するようになっています.

ちなみに,xxxIndex の最大値は xxxItems の要素数 - 1
です.

> また、Pegerを使用する画面では通番を表示したいため
> xxxIndexのgetterにて、PagerViewHelperよりoffsetを
> 取得して、xxxindex値に足して表示しています。
> こんな感じです↓↓↓
> public int getXxxIndex() {
>     return this.xxxIndex + 1 + this.pagerViewHelper.getOffset();;
> }

これはやめていただいた方がよいかと.
xxxIndex とは別のプロパティにする方が無難です.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



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