要素を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 件のコメント:
コメントを投稿