我實現一個Iterator它利用另一個Iterator,它的我不知道,它是否支持remove()
方法還是不行。Java異常Iterator的合同刪除
考慮下面的邊緣情況:底層迭代器不支持remove()
和我的迭代器next()
尚未被調用。
我是否違反了合同的接口,如果我的remove()
在這種情況下–的IllegalStateException
而不是UnsupportedOperationException
拋出–?
(只要next()
被調用,底層remove()
可以調用,這將引發相應的UnsupportedOperationException
。)
如果是這樣,我怎麼能修改我的代碼來檢查底層迭代器是否支持remove()
與否?
一個例子:
<T> Iterator<T> getSetViewIterator(Collection<T> collection) {
Iterator<T> uniqueItr = new HashSet<>(collection).iterator();
return new Iterator<T>() {
private T current = null;
private boolean hasRemoved = true;
@Override
public boolean hasNext() {
return uniqueItr.hasNext();
}
@Override
public T next() {
if(!hasNext())
throw new NoSuchElementException();
hasRemoved = false;
return current = uniqueItr.next();
}
@Override
public void remove() {
if(hasRemoved)
throw new IllegalStateException();
for(Iterator<T> iterator = collection.iterator(); iterator.hasNext();) {
if(iterator.next().equals(current))
iterator.remove();
}
hasRemoved = true;
}
};
}
(。對於我們而言,我們可以假定,傳遞的集合不包含null
)
這兩個例外都是在寫得很好的應用程序中永遠不會發生的,所以在實踐中我看不到這個問題。 – biziclop
授予,但作爲一個完美主義者,它會*使我感到厭煩,'remove()'改變它的異常。我相信它應該總是拋出一個'UnsupportedOperationException',如果底層的Iterator不支持它 - 我只是不知道如何實現這個... – triangular
那麼,在這種情況下,我會說你應該記住你是否已經拋出了一個ISE,並且繼續扔掉它以用於剩餘的物體的壽命。我知道這不是你想要的,但它是一致的。 – biziclop