我試圖使用List
接口創建一個循環鏈表實現,並且已經注意到一個有趣的副作用。循環鏈表和迭代器API缺乏確定性
儘管CircularLinkedList
滿足列表合同,但它打破了 其他目前實施的collection
類!
問題是這樣的 - 在的ListIterator接口提供了以下 合同的hasNext()和hasPrevious()方法:
公共布爾hasNext()
返回true,如果這個名單當 正向遍歷列表時,迭代器具有更多元素。如果列表迭代器有多個元素(換句話說,返回 true,如果next返回一個元素而不是拋出異常。)
公共布爾hasPrevious()
返回true時 遍歷列表在相反的方向。 (換句話說,返回 true,如果以前將返回一個元素而不是拋出異常。)
現在,在循環列表,每一個這些應該由合同返回假,當且僅當列表是空的。
的問題表現出來了,當你嘗試用適當的列表迭代器增加一個循環鏈表使用中的addAll()方法的另一個系列 - 該方法使用hasNext()來約束迭代,因爲它增加了每個元素。因此 循環永遠不會終止!
我目前正在考慮打破ListIterator的合同,如果您正在查看hasNext()方法或使用hasNext覆蓋來創建迭代器的子類,則使列表看起來像鏈接列表通過iterator()方法。
兩個問題:
是否有這樣做沒有打破迭代 的ListIterator或合同的更好的辦法?
是否有人認爲這是AbstractCollection類中的一個缺陷(這是繼承行爲的來源)。請注意,某些集合通過調用要添加的集合的toArray()方法並添加數組的每個元素來以更穩健的方式執行添加。