2013-08-16 2 views
4

기본적으로 반복자와 크기를 전달하는 데이터 모델을 만들고 싶습니다. 기본적으로 결과 집합의 요소를 반복하는 읽기 전용 방법입니다.ImmutableCollection 확장하기

ImmutableCollection을 확장하고 size() 및 iterator()를 구현하는 것이 최선의 방법이었습니다.이 유형이 내 의도를 적절히 전달하기 때문에.

불행히도 ImmutableCollection에는 패키지 - 개인용 isPartialView가 있습니다.

내 질문 : 왜 isPartialView 패키지는 비공개인가? 그렇다면 그렇게해야합니까? 그렇다면 내 읽기 전용 모음을 모델링하는 가장 좋은 방법은 무엇입니까? size() 및 iterator() 메서드 (SizedIterable) 만있는 사용자 정의 유형을 생성해야합니까? 이 유스 케이스에 대한 다른 제안이 있습니까?

+0

'Iterator'에는'.remove'가 있습니다. 정말 당신은 매우 드물게 ** ** 컬렉션 클래스를 확장해서는 안 자신의 모든 내용 : – zapl

+2

쓰기>에만 IMO 청소기없이 읽어 보시기 바랍니다. 대신 ** 클래스 내에서 ImmutableCollection 유형의 필드를 가지고 컬렉션을 사용하고 size() 및 iterator()를 구현하도록 위임해야합니다. –

+1

기존의'반복자()'와 ImmutableCollection''의'크기()'방법 뭐가 잘못? – phlogratos

답변

3

Collection 인터페이스의 많은 작업은 선택 사항으로 간주됩니다. 구현에 대해 직접 구현을 작성하고 구현에서 지원하지 않는 작업에 대해서는 UnsupportedOperationException을 던져 넣을 수 있습니다. 이것은 ImmutableCollection을 확장해야하는 것을 피할 수있는 방법입니다.

불변 모음 : 해당 설명서는 다음과 같은 상태로

서브 클래 싱 ImmutableCollection은 아마 옵션이 아닙니다. null 요소를 허용하지 않습니다.

참고 :이 클래스는 final이 아니지만 public 또는 protected 생성자가 없으므로이 패키지 외부에서 서브 클래스로 만들 수 없습니다. 이 때문에,이 형태의 인스턴스는 변경 불가능한 것이 보증되고 있습니다.

+1

을 던지고 [UnsupportedOperationException가 (http://docs.oracle.com/javase/6/docs/api/java/lang/UnsupportedOperationException.html)을가'()에서 [UnmodifiableIterator]의 방법 (HTTP 제거 정확히 [ImmutableCollection]의 //docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/UnmodifiableIterator.html) (http://google-collections.googlecode.com/svn/trunk/ javadoc/com/google/common/collect/ImmutableCollection.html). – phlogratos

+0

그렇습니다. 설명은 주로 읽기 전용 이터레이터를 통해 ** 액세스를 제공하는 사용자 정의 컬렉션 구현의 목적을위한 것입니다. 귀하의 관점에서, 이것은 효과적으로 ImmutableCollection의 기능입니다. – Surveon

4

성능 문제가 아닌 경우 다른 컬렉션 구현을 시도하지 않는 것이 좋습니다. 컬렉션의 읽기 전용보기는 Java에서 Collections.unmodifiableCollection() 메소드를 사용하여 이미 제공됩니다. 구아바에 머 무르려면 ImmutableList, ImmutableSetImmutableMap이 체크 아웃하려는 수업입니다. 크기를 확인하려면 Guava의 Iterables.size() 메서드를 사용할 수 있습니다.

성능 문제가있는 경우 ForwardingCollectionUnmodifiableIterator으로 스키마를 구현하는 것이 좋습니다. 예 : 크기를 캐싱

public static class CollectionWithUnmodifiableIterator<E> extends ForwardingCollection<E> { 
    private final Collection<E> collection; 
    public CollectionWithUnmodifiableIterator(final Collection<E> collection) { 
     this.collection = collection; 
    } 
    @Override 
    protected Collection<E> delegate() { 
     return collection; 
    } 
    @Override 
    public Iterator<E> iterator() { 
     return Iterators.unmodifiableIterator(super.iterator()); 
    } 
} 

addAllremoveAll 사용하지 않는하거나 집안일이 대리자 메서드의 반환 값을 기반으로 구현 될 수있는 addremove 호출을 통해 깔때기된다는 가정하에도 가능 . 그러나 다른 제한 사항 (예 : 목록에만 사용되는 경우 addAll을 최적화 할 수 있습니다.

+0

게으른가요? 거기에 게으른 무엇입니까 ??? – maaartinus

+0

좋은 캐치, 나는 틀렸다. ForwardingCollection은 더 나은 선택입니다. – allprog