Iteratorパターンとは、集合の中から要素を1つずつ数える(取り出す)パターンである。
要素を1つずつ取り出したいときは、集合(配列でも何でも良い)から直接for文などで処理を書くことがあるが、Iteratorを用意することでこの処理をIteratorに任せることができる。そして後はIteratorで用意されるメソッド(大体はnext()やhasNext())を利用するだけで良いので,集合クラスの実装を意識しなくて済むという利点がある。
集合クラスを利用する側において、直接for文を利用した場合は
-
- Sample[] samples = sampleAggregate.getArray();
- for (int i = 0; i < samples.length; i++) {
- ・・・
- }
// 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();
- ・・・
- }
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)