문제

저는 종종 컬렉션을 만들 필드를 수정할 수 없게 돌아오기 전에 그것에서 getter 방법:

private List<X> _xs;
....
List<X> getXs(){
  return Collections.unmodifiableList(_xs);
}

그러나 나는 생각할 수 없는 편리한 방법의 하는 경우 엑상은 그 자체로 목록:

private List<List<Y>> _yLists;
.....
List<List<Y>> getYLists() {
  return Collections.unmodifiableList(_yLists);
}

문제에서 위의 과정을 하지만 클라이언트를 수정할 수 없는 목록의 목록을 추가할 수 있/삭제 Y 체에서 포함된다.

어떤 생각?

도움이 되었습니까?

해결책

내가 용도로 내릴 수있는 최선 Google 컬렉션의 전달 목록. 의견을 환영합니다.

private static <T> List<List<T>> unmodifiableList2(final List<List<T>> input) {
    return Collections.unmodifiableList(new ForwardingList<List<T>>() {
        @Override protected List<List<T>> delegate() {
            return Collections.unmodifiableList(input);
        }
        @Override public List<T> get(int index) {
            return Collections.unmodifiableList(delegate().get(index));
        }
    });
}

다른 팁

불행히도, Java에서 깊은 성능을 얻는 쉬운 방법은 없습니다. 목록 내부의 목록도 수정할 수 없는지 확인함으로써 항상 해킹해야합니다.

우아한 솔루션을 아는데도 관심이 있습니다.

Clojure 의 컬렉션(지도,세트,목록,벡터)모든 수 있습니다 중첩은 불변합니다.순수한 java,이 라이브러리:

http://code.google.com/p/pcollections/

수집 할 수없는 모음의 구현을 살펴보면 컬렉션을 랩핑하는 것을 볼 수 있습니다. 같은 방식으로 깊은 유틸리티를 수행하는 것은 가능해야합니다.

이것의 단점은 컬렉션 액세스에 추가 메소드 호출을 추가하므로 성능에 영향을 미친다는 것입니다.

여기서 유일한 목표가 캡슐화를 시행하는 것이라면, 클래식 솔루션은 Clone () 또는 유사한 객체의 내부 상태가 아닌 구조를 반환하는 것입니다. 이것은 분명히 모든 객체를 복제 할 수 있고 복사 된 구조가 충분히 작아지는 경우에만 작동합니다.

이것이 상당히 일반적으로 사용되는 데이터 구조 인 경우, 또 다른 옵션은 API에 더 구체적인 액세스를 제공하여 특정 통화를보다 자세히 제어 할 수 있도록하는 것입니다. 위와 같이 자신의 목록 구현을 작성합니다 하나 이를 수행하는 방법이지만 특정 사용 사례로 호출을 좁힐 수있는 경우 목록 인터페이스 대신 특정 액세스 API를 노출시킬 수 있습니다.

누군가가 여기에 관심이있는 경우 간단한 해결책이 있습니다.

    public List<List<Double>> toUnmodifiable(List<List<Double>> nestedList) {
        List<List<Double>> listWithUnmodifiableLists = new ArrayList<>();
            for (List<Double> list : nestedList) {              
                listWithUnmodifiableLists
                    .add(Collections.unmodifiableList(list));
            }
        return Collections.unmodifiableList(listWithUnmodifiableLists);
    }

getList () 메소드가있는 목록을 노출하려면 예를 들어 솔루션으로 사용할 수 있습니다. TOUNMODIFIBLE (MNESTEDLIST), 여기서 MNESTEDLIST는 클래스의 개인 목록입니다.

나는 Android에서 GSON과 함께 구문 분석에 사용되는 클래스를 구현할 때 개인적으로 유용하다는 것을 알았습니다. 응답을 수정할 수있는 것은 의미가 없기 때문에,이 경우 해제 된 JSON 은이 방법을 노출시키는 방법으로 사용했습니다. Getter가있는 목록과 목록이 수정되지 않도록했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top