누군가가 어떤 생각을 가지고 있습니까? removeRange 메서드가 AbstractList (및 ArrayList) 인 이유는 protected
입니까? 꽤 잘 정의되고 유용한 연산 인 것처럼 보이지만 사용하려면 List 구현을 하위 클래스로 만들어야합니다.Java의 AbstractList의 removeRange() 메소드가 보호되는 이유는 무엇입니까?
숨겨진 이유가 있습니까? 나에게 꽤 설명 할 수없는 것 같다.
누군가가 어떤 생각을 가지고 있습니까? removeRange 메서드가 AbstractList (및 ArrayList) 인 이유는 protected
입니까? 꽤 잘 정의되고 유용한 연산 인 것처럼 보이지만 사용하려면 List 구현을 하위 클래스로 만들어야합니다.Java의 AbstractList의 removeRange() 메소드가 보호되는 이유는 무엇입니까?
숨겨진 이유가 있습니까? 나에게 꽤 설명 할 수없는 것 같다.
예, 외부 코드에서 범위를 제거하는 방법이 아니기 때문입니다. 대신 다음을 수행하십시오
list.subList(start, end).clear();
이 실제로 무대 뒤에서 removeRange
호출합니다. removeRange
가 List
공개 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.clear
및 SubList.removeRange
입니다.
좋아, 그런 식으로 할 수 있지만 * 왜 *? 어색해 보인다. 단일 요소는 목록에서 직접 제거 할 수 있습니다. 왜 여러 요소가 아닌가? –
@ 주저 : Effective Java의 Item 40, 2nd ed는 이에 대한 이유를 설명합니다. 책이없는 경우를 대비하여 관련 섹션에 붙여 넣습니다. –
고마워, 정확히 내가 무엇을 찾고 있었는지! 이제 약간 * 감각이 생깁니다 :) –