자바 불변의 컬렉션
에서 자바 1.6 컬렉션 프레임 워크 문서 :
어떠한 수정 작업 (예를 지원하지 않는 컬렉션
add
,remove
및clear
)라고도 불가능한 . [...] 컬렉션의 변경 사항이 표시되지 않도록 추가로 보장하는 컬렉션은 불변 이라고합니다 .
두 번째 기준은 저를 혼란스럽게합니다. 첫 번째 컬렉션의 내용은 수없고 원래 컬렉션 참조가 삭제되고 가정하면 두 번째 줄에서 무엇입니까? 컬렉션에 보유 된 요소의 변화, 즉 요소의 상태를 변화하고 있습니까?
두 번째 질문 :
컬렉션을 평가할 수 있고 유효한 추가 보증을 제공하는 방법은 무엇입니까? 컬렉션의 요소 상태가 일상적으로 업데이트되는 경우, 상태의 업데이트가 변경 불가능한 컬렉션을 보유하고있는 것이 표시되지 않는 것이 불변성에 충분합니까?
컬렉션을 사용하지 않는 것보다 비용이 많이 드는 보증을 제공하는 방법은 무엇입니까?
수정 불가능한 컬렉션은 일반적으로 다른 컬렉션의 읽기 전용보기입니다. 추가, 제거 또는 지울 수 없지만 기본 컬렉션은 변경 될 수 있습니다.
변경 불가능한 컬렉션은 전혀 무시 수없는 컬렉션을 래핑하지 자체 요소가 있습니다.
구아바의 인용문입니다. ImmutableList
Collections.unmodifiableList(java.util.List<? extends T>)
여전히 게시 수있는 별도의 컬렉션에 대한보기 인와 달리 인스턴스ImmutableList
는 자체 개인 데이터 를 포함 하며 절대 변경되지 않습니다.
따라서 기본적으로 변경 불가능한 컬렉션에서 변경 불가능한 컬렉션을 가져 오려면 해당 요소를 새 컬렉션에 복사하고 모든 조작을 허용하지 않습니다.
차이점은 변경을 허용하는 불변 컬렉션에 대한 참조를 변경합니다. 수정 불가능한 컬렉션은 해당 참조를 여러 가지 다른 오브젝트가 있습니다.
예 :
List<String> strings = new ArrayList<String>();
List<String> unmodifiable = Collections.unmodifiableList(strings);
unmodifiable.add("New string"); // will fail at runtime
strings.add("Aha!"); // will succeed
System.out.println(unmodifiable);
Collection<String> c1 = new ArrayList<String>();
c1.add("foo");
Collection<String> c2 = Collections.unmodifiableList(c1);
c1
이다 변경 가능 (즉,도 불가능한 도 불변 ).
c2
이다 불가능한 : 그 자체를 변경할 수 없습니다, 난 변경할 나중에하지만 경우 c1
다음 것을 변경에-display됩니다 c2
.
이것은 c2
실제로 랩퍼 이기 때문에 c1
실제로는 인 사본 이 아니기 때문 입니다 . 구아바는 ImmutableList
인터페이스 와 일부 구현을 제공합니다 . 기능은 실제로 입력의 사본을 생성 작동합니다 (입력이 자체적으로 입력 된 컬렉션이 아닌 한).
두 번째 질문과 관련하여 :
컬렉션 의 변경 / 불변성은 그 안에 포함 된 객체의 변경 /에 의존 불변 하지 않습니다 . 에 포함 된 컬렉션 개체를 수정하는 [해석] 이 설명에, 대한 '컬렉션 수정 "간주으로 되지 않습니다 . 불변의 컬렉션이 필요한 경우, 일반적으로 불변의 클래스를 포함하기를 원합니다.
이제 java 9 에는 불변 목록, 설정, 맵 및 Map.Entry에 대한 팩토리 메소드가 있습니다.
Java SE 8 및 이전 버전에서는 수정할 수없는 XXX와 같은 컬렉션 클래스 메소드를 사용하여 변경 불가능한 컬렉션을 사용하여 변경할 수 있습니다.
그러나 그러나 Collections.unmodifiableXXX 메서드는 매우 지루하고 장황한 방법입니다. 단점을 극복하기 위해 Oracle Corp은 List, Set 및 Map 인터페이스에 몇 가지 유틸리티 방법을 추가했습니다.
이제 Java 9 : -List 및 Set 인터페이스에는없는 것 같이 비어 있거나 비어 있거나 Immutable List 또는 Set을 생성하는 "of ()"메소드가 있습니다.
빈 목록 예
List immutableList = List.of();
비어 있지 않은 목록 예
List immutableList = List.of("one","two","three");
여기서 중요한 것은 컬렉션이 수정 불가능합니다. 예를 들어 요소가 너무 오래된 경우 요소를 제거하는 모음을 예로 들어 보겠습니다. 행사에 참석하지 않습니다. 이것의 진정한 예는 Collections.unmodifiableList
방법입니다. 리스트의 수정 불가능한 뷰를 리턴합니다. 이 메소드에 전달 된 목록 참조는 여전히 수정이 가능합니다. 이로 인해 ConcurrentModificationExceptions 및 기타 나쁜 일이 보관 수 있습니다.
설명 수 없음은 컬렉션을 의미합니다.
두 번째 질문 : 불변 컬렉션은 컬렉션에 포함 된 개체가 변경되지 않는다는 것, 해당 컬렉션은 컬렉션의 개체 수와 구성이 변경되지 않습니다. 즉, 컬렉션의 참조 목록은 변경되지 않습니다. 그렇다고 생각해서 참조되는 내부를 내부를 사용합니다.
Pure4J 는 다음과 같은 두 가지 방식으로 지원합니다.
먼저 @ImmutableValue
주석을 제공 하므로 클래스에 주석을 달아 변경할 수 없다고 말할 수 있습니다. 가 코드 실제로 변경 불가능 하다는 것을 확인할 수있는 받는다는 플러그인이 있습니다 (사용 final
등).
둘째, Clojure의 영구 컬렉션 (제네릭 추가)을 제공하고 컬렉션에 추가 된 요소를 완성합니다. 이것들의 성능은 분명히 좋습니다. 컬렉션은 모두 불변이지만 검사를 위해 Java 컬렉션 인터페이스 (및 제네릭)를 구현합니다. 돌연변이는 새로운 컬렉션을 반환합니다.
면책 조항 : 나는 이것의 개발자입니다
참고 URL : https://stackoverflow.com/questions/7713274/java-immutable-collections
'IT' 카테고리의 다른 글
잘못된 인증서로 https 요청을 수행하는 방법은 무엇입니까? (0) | 2020.08.05 |
---|---|
제공 한 인증이 지원되지 않습니다. (0) | 2020.08.05 |
선택하십시오. (0) | 2020.08.05 |
라이브러리를 정적으로 링크하도록 gcc에 직접 알리기 (0) | 2020.08.05 |
Android에서 Toast와 동일한 기능을 가진 iOS에서 메시지 표시 (0) | 2020.08.05 |