2010-02-18 3 views

답변

140

예, 외부 코드에서 범위를 제거하는 방법이 아니기 때문입니다. 대신 다음을 수행하십시오

list.subList(start, end).clear(); 

이 실제로 무대 뒤에서 removeRange 호출합니다. removeRangeList 공개 API의 일부가 아닌 이유


† 영업 묻습니다. 그 이유는 Effective Java 2nd ed의 Item 40에 설명되어 있으며 여기에서 인용합니다.

지나치게 긴 매개 변수 목록을 단축하는 세 가지 기술이 있습니다. 하나는 메소드를 여러 메소드로 분해하는 것이며, 각 메소드는 매개 변수의 서브 세트 만 필요로합니다. 부주의하게 수행되면 너무 많은 방법으로 이어질 수 있지만 을 줄이면의 직교성이 증가하여 카운트가 줄어 듭니다. 예를 들어, java.util.List 인터페이스를 고려하십시오. 하위 목록에서 요소의 첫 번째 또는 마지막 색인을 찾기위한 메소드를 제공하지 않으며 둘 다 세 개의 매개 변수가 필요합니다. 대신 subList 메서드를 제공합니다.이 메서드는 두 개의 매개 변수를 사용하고 하위 목록의보기 을 반환합니다. 이 메서드는 각각 하나의 매개 변수를 가진 indexOf 또는 lastIndexOf 메서드와 결합하여 원하는 기능을 생성 할 수 있습니다. 더욱이, subList 메소드는 List 인스턴스에서 작동하는 서브리스트에 대해 임의의 계산을 수행하는 임의의 메소드와 결합 될 수 있습니다. 결과 API는 매우 높은 power-to-weight 비율을 갖습니다.

하나는 removeRange가 많은 매개 변수가 아마 때문에하지 않는이 치료 후보,하지만 subList을 통해 removeRange를 호출하는 방법이 주어진하지 않음을 주장 할 수 난장판 할 이유가없는 List 중복 방법 인터페이스.


AbstractList.removeRange 문서는 말한다 :

이 방법은이 목록과 하위 목록에 clear 동작에 의해 호출됩니다. 이 메소드를 재정 의하여 목록 구현의 내부를 활용하면 은 실질적으로 일 때이 목록과 해당 하위 목록의 clear 작업의 성능을 향상시킬 수 있습니다.

또한 OpenJDK의 구현은 AbstractList.clearSubList.removeRange입니다.

+6

좋아, 그런 식으로 할 수 있지만 * 왜 *? 어색해 보인다. 단일 요소는 목록에서 직접 제거 할 수 있습니다. 왜 여러 요소가 아닌가? –

+1

@ 주저 : Effective Java의 Item 40, 2nd ed는 이에 대한 이유를 설명합니다. 책이없는 경우를 대비하여 관련 섹션에 붙여 넣습니다. –

+1

고마워, 정확히 내가 무엇을 찾고 있었는지! 이제 약간 * 감각이 생깁니다 :) –