2011-04-11 7 views
0

이해할 수없는 Immutable 컬렉션의 결함이 정확한지 확신 할 수 없으므로이 대답에 나열합니다. 누군가가 나를 여기에서 교정하기를 바랍니다.불변의 불법 복제품 모음에 결함이 있습니까?

a) : ImmutableXXX.copyOf() 은 Collections.unmodifiableXXX()와 비교하여 소스 수집 기능을 잃습니다. 예를 들어, linkedList가 ImmutableList.copyOf()에 삽입되면 ImmutableList는 더 이상 링크되지 않습니다. Tree 기반 컬렉션과 동일합니다.

b) : 사람들은 Collections.unmodifiableXXX가 소스 컬렉션의 동일한 참조를 사용하기 때문에 소스 컬렉션이 변경되면 Collections.unmodifiableXXX도 변경됩니다. 하지만 내 솔루션은 ImmutableXXX.copyOf()에 전달되는 임시 컬렉션에 소스 컬렉션을 래핑하는 것입니다. 아래 코드를 참조하십시오 :

List<String> l = new ArrayList<String>(); 
List<String> unmodifiableList = Collections.unmodifiableList(l); 
ImmutableList<String> immutableList= ImmutableList.copyOf(l); 
l.add("a");//unmodifiableList is also added "a", immutableList not. 

/*My solution as follows: 
So unmodifiableList2 is also immutable as ImmutableList.copyOf(l) does*/ 
List<String> unmodifiableList2= Collections.unmodifiableList(new ArrayList(l)); 

Immutable 컬렉션에 대한 이해는 어떻습니까? 감사!

답변

21

언급 한 내용 중 "결함"이 없습니다.

a)ImmutableList은 더 이상 연결된 목록이 아닙니다. 배열 기반 목록에 대한 링크 된 목록의 유일한 장점은 요소 추가 및 제거 (주로 제거)입니다. 당신은 불변의리스트에 추가하거나 제거 할 수 없다. 그래서 배열 기반은 메모리 효율뿐만 아니라 빠른 랜덤 액세스를 위해 바람직하다.

TreeSet과 같이 몇 가지 사항을 고려해야합니다.

  1. 보통 ImmutableSet은 주어진 요소의 반복 순서를 유지합니다. 따라서 TreeSet이 있고 ImmutableSet.copyOf을 사용하여 변경 불가능한 복사본을 만드는 경우 복사 된 요소는 원본과 동일하게 정렬됩니다.
  2. ImmutableSortedSetTreeSet과 동일하며 요소의 자연 순서를 사용하거나 TreeSet처럼 Comparator을 사용합니다.

B) 당신은 아무것도 변경되지 않습니다 구아바를 사용하지 않고 불변 일어나는 List을 만들 수 있다는 사실. 구아바의 불변의 컬렉션을 염두에 불변성과 특히을 설계하고 그들은을 포함하여 (이에 국한되지 않음) 그 때문에 다양한 장점을 가지고있다 :

  • 내가 언급 한 바와 같이 자신의 불변성은, 타입 수준에서 보장된다는 사실 마지막 질문에 대한 답으로 메서드가 ImmutableSet 유형을 반환하면 호출자 을 알고 있으므로 해당 집합을 변경할 수 없습니다. 그렇지 않으면 그냥 Set을 반환합니다.
  • 빈 경우의 싱글 톤 및 1- 요소 경우의 특수 클래스를 포함한 메모리 최적화.
  • ImmutableSet.copyOf 등은 입력이 이미 동일한 유형의 변경 불가능한 인스턴스 인 경우 실제로 아무것도 복사하지 않습니다.
  • 불변의 콜렉션을 쉽게 만들 수있는 메소드/빌더.
+0

통찰력있는 답. 고맙습니다! –

+1

+1 아주 좋은 설명입니다. – Premraj

4

왜 우리는 극적으로 동시 프로그래밍을 단순화

  • 불변의 컬렉션을해야합니다. 그것에 대해 생각해, 왜 적절한 멀티 스레드 프로그래밍을 쓰고 있습니까? 주어진 리소스 (이 경우 목록)에 대한 스레드 액세스를 동기화하기가 어렵 기 때문에.
3

ColinD와 아미르 직접 특정 질문에 대한 답변,하지만 당신은 또한 GTUG - Using the Google Collections Library for Java (1 of 2)에서 볼 수도 있습니다 - 그가 불변 컬렉션의 모든 장점을 설명 케빈 Bourrillion (구아바의 수석 개발자)에 의해 불변의 컬렉션에 대한 프리젠 테이션.

프리젠 테이션은 2 세이며 "Google Collections"(현재 Guava의 하위 부분 임)에 중점을두고 있지만 이는 매우 흥미로운 프리젠 테이션입니다. Google Collections API는 당시 베타 버전 이었기 때문에 프리젠 테이션 이후 API가 약간 변경되었을 수 있지만 대부분의 개념은 동일하게 유지되었습니다.