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