JDKソースコード分析
イテレータパターンはJAVAの多くのコレクションで広く使用されているので、JAVAソースコードでイテレータパターンを使用する方法を見てみましょう。
このコードを読んだ後、それは非常によく知られていますか?それは基本的に上記のコードに似ています。単一列のコレクションはイテレータを使用します。例としてArrayListを使用して説明します。
- リスト:抽象集約クラス
- ArrayList:具象集計クラス
- イテレータ:抽象イテレータ
- list.iterator():返されるのは、
Iterator
インターフェイスを実装する具象イテレータオブジェクトです。
ArrayListのコード実装を具体的に見てみましょう
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // 下一个要返回元素的索引
int lastRet = -1; // 上一个返回元素的索引
int expectedModCount = modCount;
Itr() {}
//判断是否还有元素
public boolean hasNext() {
return cursor != size;
}
//获取下一个元素
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
...
}
コードのこの部分は比較的単純で、iterator
メソッドでインスタンス化されたIterator
オブジェクトを大まかに 返します 。Itrは、Iterator
インターフェイスを実装し、その中の抽象メソッドを書き換える内部クラスです 。
注意:
JAVAで開発しているときに、イテレータモードを使用する場合は、
独自に定義したコンテナクラスに
java.util.Iterable
そのiterator()メソッドを実装して実装させるだけです
java.util.Iterator
実装クラスを返すようにする だけです。