我的框架充满了迭代器,比如
int n = col.getSize();
for (int i = 0 ; i != n; i++) {
Type obj = col.get(i);
而且,我觉得每个在索引上迭代项目的程序都有一段这样的代码。与整洁的 foreach 相比,感觉很难看
for (Type obj : col) {
转换到 foreach 需要使所有集合都可迭代,这意味着在每个 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,另一个是 next()。我想知道为什么 Sun 不提供这样的类?每个人都需要它。我只是忽略了它吗?