私のフレームワークは次のようなイテレータでいっぱいです
int n = col.getSize();
for (int i = 0 ; i != n; i++) {
Type obj = col.get(i);
そして、インデックス上でアイテムを反復処理するすべてのプログラムには、このようなコードが含まれていると思います。きちんとしたforeachに比べて醜い感じです
for (Type obj : col) {
foreachに移行するには、すべてのコレクションをIterableにする必要があります。つまり、すべてのiterator()メソッドで新しいIteratorを作成する必要があります。今、私はその使用場所ではなく、すべてのコレクション宣言に醜いコードを持っていました。それで、私は良い仕事をしました、私は醜いコードをcommon.utilsに移しました。
public abstract class ImmutableIterator<T> implements Iterator<T> {
private int i = 0;
private final int size = getSize();
public abstract int getSize(); // to be implemented by user
public abstract T getValue(int i); // to be implemented by user
public T next() {
if (!hasNext()) throw new NoSuchElementException();
return getValue(i++);
}
public boolean hasNext() { return i != size;}
public void remove() {
throw new UnsupportedOperationException("Remove is not implemented");
}
}
今、私はこの醜いパターンを唯一の場所で分離しました。これが私にできる最善のことです。コレクションはサイズと値(i)を提供します。唯一の問題はパフォーマンスの低下です。最初はhasNextで、もう1つはnext()で、ループ内でサイズチェックを2回実行する必要があります。なぜSunはそのようなクラスを提供しないのだろうか?みんなに必要です。見落としただけですか?