commons-collectionsのListUtils.lazyList

昨日書いたNested Propertyなんですけど、Listがダイナミックに作成されるわけで、Strutsはアホなので新しいform beanを作ろうにもlistのサイズなんか知らないんですね。 そこで便利なのが、commons-collections パッケージ[jakarta.apache.org]にあるリストラッパーです。例えばlistのサイズが3で、インデックス7をリクエストしたら、factoryオブジェクトを使って自動的にサイズ7まで増やしてくれるんです。
使い方は簡単。


import org.apache.struts.action.ActionForm;
import org.apache.commons.collections.Factory;
import org.apache.commons.collections.ListUtils;

import izu.beans.NameBean;
import java.util.List;
import java.util.ArrayList;

public class NameListForm extends ActionForm implements Factory {
private List nameList;

public NameListForm() {
nameList = ListUtils.lazyList(new ArrayList(), this); ←[訂正]nekopさん、サンキュ!
reset();
}

public void reset() {
nameList.add(new NameBean("Izumi", "Kamitani"));
nameList.add(new NameBean("Nadim", "Bitar"));
nameList.add(new NameBean("First", "Last"));
}

//Factoryクラスから
public Object create() {
return new NameBean();
}


public void setNameList(List nameList) {
this.nameList = nameList;
}

public List getNameList() {
return nameList;
}

public NameBean getName(int index) {
return (NameBean) nameList.get(index);
}
}

ListUtilsもFactoryもcommons-collectionsパッケージにはいってます。 APIはこちら[jakarta.apache.org]。 Mapを使う場合は、MapUtilsにlazyMapが用意されてます。