List
인터페이스를 사용하여 순환 연결 목록 구현을 만들려고하고 흥미로운 부작용을 발견했습니다.순환 링크 목록 및 반복기 API의 확실성 부족
CircularLinkedList
이 List 계약을 충족 시키더라도 다른 현재 구현 된 collection
클래스는 깨집니다!
공공 부울 hasNext()리스트가있는 경우
true를 반환 다음 반복자 인터페이스는 hasNext()와 hasPrevious에 대해 다음 계약() 메소드를 제공합니다 -
문제는 이것이다 이 순방향으로 목록을 이동할 때 반복기는 더 많은 요소를 갖습니다. (다음 예외를 throw하는 일없이 요소를 돌려주는 경우 즉, true를 반환합니다.)
공공 부울 hasPrevious()
반환 사실이리스트 반복자가 한층 더 요소를 가지고있는 경우 목록을 통과 할 때 반대 방향으로. (이전의 예외를 throw하는 일없이 요소를 돌려주는 경우 즉, true를 반환합니다.)
이제 원형 목록에서 이들 각각은해야 계약 리턴 거짓 경우에만 목록이있는 경우로 비었다. 이 각각의 요소를 추가로 반복을 제한하는 방법이 사용 hasNext() - 당신이 오퍼레이션과 addAll() 방법을 사용하여 다른 컬렉션에 적절한리스트 반복자와 원형 목록을 추가 할 때
문제는 그 자체를 보여줍니다 . 따라서 루프가 종료되지 않습니다!
현재 hasNext() 메서드를보고 있거나 hasNext가 반환되도록 재정의 된 하위 클래스를 만드는 경우 목록을 연결된 목록처럼 보이게하려면 ListIterator 계약을 위반하는 것이 좋습니다. iterator() 메소드에 의해.
두 질문 :
반복자 또는 반복자 계약을 깨지 않고이 일을 더 나은 방법이 있나요?
누구든지 이것이 (상속 된 동작의 출처 인) AbstractCollection 클래스의 결함이라고 생각하는 사람이 있습니까? 일부 콜렉션은 추가 할 콜렉션의 toArray() 메소드를 호출하고 배열의 각 요소를 추가하여 더 강력한 방법으로 추가 작업을 수행합니다. 제 생각에는