어떤 사람들은 "선택적 방법"을 싫어할 수 있지만, 많은 경우 고도로 분리 된 인터페이스보다 더 나은 의미를 제공 할 수 있습니다. 무엇보다, 그들은 객체가 일생 동안 능력이나 특성을 얻을 수 있거나, 객체 (특히 래퍼 객체)가 언제 어떤 정확한 능력을보고해야하는지 알 수없는 가능성을 허용합니다.
좋은 디자인의 Java 콜렉션 클래스 모범 (paragon)이라고 부르지는 않지만, 훌륭한 콜렉션 프레임 워크는 그 특성과 능력에 대한 콜렉션을 요청하는 방법 과 함께 많은 선택적 메소드 를 기본으로 포함해야한다고 제안 합니다 . 이러한 디자인은 단일 래퍼 클래스가 기본 컬렉션이 보유 할 수있는 능력을 실수로 모호하게하지 않으면 서 다양한 컬렉션과 함께 사용할 수 있도록합니다. 메소드가 선택 사항이 아닌 경우 콜렉션이 지원할 수있는 모든 기능 조합에 대해 다른 랩퍼 클래스가 필요하거나 일부 상황에서 일부 랩퍼를 사용할 수 없게해야합니다.
예를 들어, 컬렉션이 인덱스로 항목을 쓰거나 끝에 항목을 추가 할 수는 있지만 중간에 항목을 삽입하는 것을 지원하지 않는 경우에는 래퍼로 항목을 캡슐화하려는 코드에서 실행되는 모든 작업을 기록하는 코드가 버전이 필요합니다 지원되는 기능의 정확한 조합을 제공하는 로깅 래퍼의 경우 또는 사용 가능한 것이없는 경우 추가 또는 색인 별 쓰기를 지원하지만 둘 다를 지원하지 않는 래퍼를 사용해야합니다. 그러나 통합 콜렉션 인터페이스가 세 가지 메소드를 모두 "선택적"으로 제공했지만 사용할 수있는 선택적 메소드를 표시하는 메소드를 포함하면 단일 랩퍼 클래스가 기능 조합을 구현하는 콜렉션을 처리 할 수 있습니다. 지원하는 기능이 무엇인지 물으면 랩퍼는 캡슐화 된 콜렉션이 지원하는 모든 것을 간단히보고 할 수 있습니다.
"선택적 능력"의 존재는 어떤 경우에는 집합의 콜렉션이 구현의 존재에 의해 능력이 정의 된 경우 가능한 것보다 훨씬 더 효율적인 방식으로 특정 기능을 구현할 수있게한다. 예를 들어, concatenate
메소드가 두 개의 다른 콜렉션 중에서 복합 콜렉션을 형성하는 데 사용되었다고 가정 하십시오. 첫 번째는 1,000,000 개의 요소가있는 ArrayList이고 마지막은 시작부터 반복 할 수있는 20 개의 요소 콜렉션이었습니다. 복합 컬렉션에 1,000,013 번째 요소 (인덱스 1,000,012)가 요청 된 경우 ArrayList에 포함 된 항목 수 (예 : 1,000,000)를 요청하고 요청 된 인덱스에서 해당 항목을 빼고 (수율 12) 두 번째 요소에서 12 개의 요소를 읽고 건너 뛸 수 있습니다. 컬렉션, 다음 요소를 반환합니다.
이러한 상황에서 복합 콜렉션은 인덱스로 항목을 즉시 리턴하는 방법이 없지만 1,000,013 번째 항목에 대해 복합 콜렉션을 요청하는 것은 개별적으로 1,000,013 개의 항목을 읽고 마지막을 제외한 모든 항목을 무시하는 것보다 훨씬 빠릅니다. 하나.