拡張for文:java5.0から新しく加わった機能うちのひとつ。
foreachっぽく、
for(要素:集合){
要素に対する処理
}
こんな感じで、1.4以前にやっていたiteratorを使った決まりの処理が()内に集約されるおかげで、{}の中がスッキリして見える。個人的に結構好きだったりする機能なのだが自作のコレクションクラスでこの拡張for文を使うにはどうすればよいのか分かっていなかった。
んで、いつもよく見る5.0関係のページで調べてみたらどうやらjava.lang.Iterableインタフェースを実装させる必要があるらしい。といっても実装すればいいmethodはiteratorを返すiterator()ひとつだけ。
以下作成例。
public class HogeList implements Iterable<Hoge> {
ArrayList<Hoge> hogeList = new ArrayList<Hoge>();
(中略)
public Iterator<Hoge> iterator() {
return this.hogeList.iterator();
}
}
これでHogeListのオブジェクトに対して拡張for文が使えるようになる。
先に載せたページの後半にもあるように、拡張for文ってそんな大した機能じゃなく、コンパイラがiteratorでぐるぐる回す1.4以前のソースに変換させてるだけなので、ArrayListで実行速度を求める場合には向かないかもしれない。(実は今研究室で作ってるプログラムがこの問題に直面している。読みやすさをとるか、パフォーマンスをとるべきか...。get()で実装し直そうか悩む。)