2010年4月25日日曜日

Iteratorパターン

Iteratorパターンとは、集合の中から要素を1つずつ数える(取り出す)パターンである。

要素を1つずつ取り出したいときは、集合(配列でも何でも良い)から直接for文などで処理を書くことがあるが、Iteratorを用意することでこの処理をIteratorに任せることができる。そして後はIteratorで用意されるメソッド(大体はnext()やhasNext())を利用するだけで良いので,集合クラスの実装を意識しなくて済むという利点がある。

集合クラスを利用する側において、直接for文を利用した場合は
// SampleAggregateクラスはSampleクラスのオブジェクトを要素として、それを複数個持つクラス
Sample[] samples = sampleAggregate.getArray(); // 集合クラスが持つ配列を取得
for (int i = 0; i < samples.length; i++) {
    ・・・
}
となるがこの場合だと、

  • 自分で数えないといけない
  • 配列以外の集合(例えばArrayList)に切り替わった場合、利用する側も修正する必要がある 

というデメリットがある。
Iteratorの場合は
Iterator itr = sampleAggregate.iterator();
while (itr.hasNext()) {
    sample = (Sample) itr.next();
    ・・・
} 
となり、上記2つのでメリットが克服できる。(もちろん、要素の管理方法が配列からArrayListに変わった場合はIteratorクラスは修正する必要があるが、集合クラスを利用する側は修正の必要がない)

 関連パターン:
「Visitorパターン」(勉強中)
Compositeパターン」再帰的な構造を取っているパターンなので、これにIteratorパターンを適用するのは難しい。
「Factory Methodパターン」 Iteratorインスタンス生成にFactory Methodパターンが使われることがある。

※気づいた点
この本のサンプルプログラムでは、hasNext()を利用せずにずっとnext()を使っていると、「ArrayIndexOutOfBoundsException」が発生し、「インデックスが範囲外である」ことを教えてくれるが、それよりも「NoSuchElementException(要素がありません)」の方が分かりやすいんじゃないかな・・・実際、Java APIのjava.util.Iteratorを見ると、後者の例外を投げてくれます。

 参考URL:Iterator(Java Platform SE 6)

0 件のコメント:

コメントを投稿