イテレータモードは、コレクションオブジェクトの基になる表現を知らなくても、一貫したメソッドを使用してコレクション要素をトラバースするための統一されたインターフェイスを提供します。つまり、内部構造を公開しません。
非表示の内部クラスのタイプの役割は、
プライベートメンバーを含む、そのクラスの無制限の外部メンバーにアクセスできます。
/ *
*内部クラス(内部クラス)
*定義:クラス、メソッド本体、インターフェイスで定義されたクラス
*関数
*型の非表示に使用
*内部クラスは、プライベートメンバーを含む外部クラスのメンバーに無制限にアクセスできます
* /
/ *イテレータモード(イテレータ):アクセスアクションの抽象化
- 下部に保存されているデータのコレクション:配列(int)、プライベート、外部から直接アクセスできない
- プライベート内部クラスを介してイテレータを実装する
- 名前付き内部クラス
- 匿名の内部クラス
* /
//迭代器接口
public interface Iterator {
int current();
int next();
boolean isFinish();
}
public class Sequence {
private int[] data;
private int cur;
public Sequence(int n) {
data = new int[n];
for (int k = 1; k <= n; k++) data[k-1] = k;
}
//返回一个接口,让外界按指定的顺序读取data
public Iterator iterator() {
cur = 0;
return new NormalIterator();
}
//顺序访问,类型隐藏,DAO
private class NormalIterator implements Iterator {
@Override
public int current() {
return data[cur];
}
@Override
public int next() {
if (cur < data.length) cur++;
if (isFinish()) return -1;
return data[cur];
}
@Override
public boolean isFinish() {
return (cur == data.length);
}
}
//逆序访问,在方法中定义的匿名内部类
public Iterator invIterator() {
cur = data.length - 1;
//改为用在方法中定义的匿名内部类实现
return new Iterator() {
@Override
public int current() {
return data[cur];
}
@Override
public int next() {
if (cur >=0) cur--;
if (isFinish()) return -1;
return data[cur];
}
@Override
public boolean isFinish() {
return (cur == -1);
}
};
}
}
public static void main(String[] args) {
Sequence s = new Sequence(20);
//Iterator iter = s.iterator();
Iterator iter = s.invIterator();
do {
System.out.print(iter.current() + " ");
iter.next();
} while (!iter.isFinish());
}