Java의 AbstractList의 removeRange () 메소드가 보호되는 이유는 무엇입니까?


98

누구든지 AbstractList (및 ArrayList )의 removeRange 메서드가 어떤 아이디어 가 있습니까? 꽤 잘 정의되고 유용한 작업처럼 보이지만 여전히이를 사용하려면 List 구현을 하위 클래스로 만들어야합니다.protected

숨겨진 근거가 있습니까? 나에게는 설명 할 수없는 것 같다.

답변:


163

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

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

이것은 실제로 removeRange무대 뒤를 호출 합니다.


OP는 왜 공용 API의 removeRange일부가 아닌지 묻습니다 List. 그 이유는 Effective Java 2nd ed의 항목 40에 설명되어 있으며 여기에서 인용합니다.

너무 긴 매개 변수 목록을 줄이는 세 가지 기술이 있습니다. 하나는 메서드를 여러 메서드로 나누는 것입니다. 각 메서드에는 매개 변수의 하위 집합 만 필요합니다. 부주의하게 수행하면 메서드가 너무 많이 생성 될 수 있지만 직교성을 높여 메서드 수를 줄이는 데 도움이 될 수도 있습니다 . 예를 들어, java.util.List인터페이스를 고려하십시오 . 하위 목록에서 요소의 첫 번째 또는 마지막 색인을 찾는 방법을 제공하지 않으며, 둘 다 세 개의 매개 변수가 필요합니다. 대신 subList두 개의 매개 변수를 취하고 하위 목록 의 보기 를 리턴하는 메소드를 제공합니다 . 이 메소드는 각각 하나의 매개 변수를 가진 indexOf또는 lastIndexOf메소드 와 결합 하여 원하는 기능을 생성 할 수 있습니다. 또한subList메서드는 인스턴스에서 작동하는 모든 메서드 와 결합하여 List하위 목록에서 임의의 계산을 수행 할 수 있습니다 . 결과 API는 중량 대 전력 비율이 매우 높습니다.

하나는 그 주장 할 수 removeRange많은 매개 변수를 가지고 아마 때문에하지 않는이 치료 후보 만 호출하는 방법이 주어진하지 않으며 removeRange관통 subList, 위 어수선 할 이유가 없다 List중복 방법과 인터페이스를.


AbstractList.removeRange 문서는 말합니다 :

이 메서드는 clear이 목록 및 하위 목록 에 대한 작업에 의해 호출됩니다 . 목록 구현의 내부를 활용하기 위해이 메서드를 재정의하면 이 목록과 하위 목록 에 대한 작업 성능을 크게 향상시킬 수 있습니다 clear.

또한 OpenJDK의 AbstractList.clearSubList.removeRange.


9
좋아, 그렇게 할 수 있지만 ? 어색해 보인다. 단일 요소를 목록에서 직접 제거 할 수 있습니다. 그러면 여러 요소가 어떻습니까?
Joonas Pulakka

1
@Joonas : Effective Java, 2nd ed의 항목 40은 이에 대한 근거를 설명합니다. 책이 없으시면 해당 부분에 붙여 넣을 게요.
Chris Jester-Young

21
+1 (질문 답변). 그러나 근거가 주어 졌다고해서 말이되는 것은 아닙니다. 매개 변수 목록을 단축하는 프로세스는 개발자가 API에서 사용할 수있는 작업을 이해하는 데 방해가되며, 이는 처음에 목록이 단축 된 이유와 직접적으로 작용합니다.
Sam Harwell 2011 년

3
자바의 경우 일반적입니다. 가장 복잡하고 덜 효과적 이도록합시다.
Tomáš Zato-Monica 복원

2
참고로 목록의 맨 끝까지 범위에 걸쳐 버전이 사용될 때 불필요하게 removeRange호출 되는 것을 알았 습니까? hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/e2117e30fb39/src/share/... (가) 전체 arraycopy 코드를 하나 넣어 봤는데 수 있도록, 0 (에서 수행으로 ); 차이점은 a) arraycopy가 기본 호출이며 오버 헤드가 발생합니다. b) arraycopy는 항상 매개 변수의 정확성을 확인합니다. stackoverflow.com/questions/12594046/…arraycopyArrayListnumMovedifremove
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.