programing

Java 불변의 컬렉션

randomtip 2022. 9. 4. 12:45
반응형

Java 불변의 컬렉션

Java 1.6 Collection Framework 문서:

컬렉션( 「」등).add,remove ★★★★★★★★★★★★★★★★★」clear)를 수정 불가라고 합니다.[...] Collection 객체의 변경 내용이 표시되지 않음을 추가로 보증하는 컬렉션은 불변이라고 합니다.

두 번째 기준은 나를 좀 혼란스럽게 한다.첫 번째 컬렉션은 수정할 수 없고 원래 컬렉션 참조가 폐기되었다고 가정할 때 두 번째 줄에서 언급되는 변경은 무엇입니까?컬렉션에 포함된 요소의 변화(요소의 상태)를 참조하는 것입니까?

번째 질문 ★★★★★★★★★★★★★★★★★★★:
추심이 불변하려면 어떻게 해야 추가 양육권자를 제공할 수 있을까?컬렉션 내의 요소 상태가 스레드에 의해 갱신된 경우 해당 상태의 업데이트가 불변 컬렉션을 보유하고 있는 스레드에 표시되지 않는 것으로 충분합니까?

컬렉션이 불변하려면 지정된 추가 보증을 어떻게 해야 합니까?

수정할 수 없는 컬렉션은 일반적으로 다른 컬렉션의 읽기 전용 보기(래퍼)입니다.이러한 컬렉션은 추가, 제거 또는 지울 수 없지만 기본 컬렉션은 변경할 수 있습니다.

불변의 컬렉션은 전혀 변경할 수 없습니다.다른 컬렉션은 랩되지 않으며 고유한 요소가 있습니다.

guava's에서 인용한 내용입니다.

★★★★★★★★★★★★★★★와 달리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 변화가 눈에 띌 것이다.c2.

그 이유는c2단순히 둘러 싸는 것이다.c1그리고 실제로 독립된 복사본은 아닙니다.Guava는 인터페이스와 몇 가지 구현을 제공합니다.이러한 기능은 입력의 복사본을 실제로 만드는 것으로 동작합니다(입력 자체가 불변의 집합인 경우는 제외).

두 번째 질문에 대해서:

컬렉션의 가변성/불변성은 포함된 객체의 가변성/불변성에 의존하지 않습니다.컬렉션에 포함된 개체를 수정하는 것은 이 설명에 대한 "컬렉션 수정"으로 간주되지 않습니다.물론 불변의 컬렉션이 필요한 경우 일반적으로 불변의 오브젝트도 포함하는 것이 좋습니다.

이제 Java 9는 공장 출하 시 불변 목록, 세트, 맵 및 맵을 위한 메서드를 가지고 있습니다.엔트리를 입력합니다.

Java SE 8 이전 버전에서는 Unmodify XXX 등의 Collections 클래스 유틸리티 메서드를 사용하여 Unmodify Collection 개체를 만들 수 있습니다.

그러나 이러한 Collections.unmodifyable XXX 메서드는 매우 지루하고 상세한 접근법입니다.이러한 단점을 극복하기 위해 Oracle Corp은 List, Set 및 Map 인터페이스에 몇 가지 유틸리티 방법을 추가했습니다.

Java 9의 :- List 및 Set 인터페이스에는 다음과 같이 비어 있거나 비어 있지 않은 Unmutable List 또는 Set 객체를 작성하는 "of()" 메서드가 있습니다.

빈 목록 예시

List immutableList = List.of();

비어 있지 않은 목록 예시

List immutableList = List.of("one","two","three");

여기서 요점은 컬렉션이 수정 불가능하더라도 변경할 수 없다는 것입니다.요소가 너무 오래된 경우 요소를 제거하는 컬렉션을 예로 들어 보겠습니다.수정 불가능은 참조를 보유한 개체가 참조를 변경할 수 없음을 의미할 뿐 변경할 수 없음을 의미하지는 않습니다.한 예는 " " " 입니다.Collections.unmodifiableList할 수 합니다.을 사용하다이 메서드에 전달된 목록 참조는 여전히 수정할 수 있으므로 전달된 참조의 모든 소유자가 목록을 수정할 수 있습니다.로 인해 Modification(동시수정)이 발생할 수 있습니다.예외와 다른 나쁜 것들.

불변, 즉 컬렉션은 변경할 수 없습니다.

두 번째 질문:불변의 컬렉션은 컬렉션에 포함된 오브젝트가 변경되지 않는다는 것을 의미하지 않습니다.단, 해당 컬렉션은 보유하는 오브젝트의 수와 구성이 변경되지 않습니다.즉, 컬렉션의 참조 목록은 변경되지 않습니다.그렇다고 해서 참조되는 객체의 내부가 변경될 수 없는 것은 아닙니다.

Pure4J는 두 가지 방법으로 원하는 것을 지원합니다.

첫 번째로, 이것은@ImmutableValue주석을 사용하여 클래스에 주석을 달아 불변임을 나타낼 수 있습니다.maven 플러그인이 있어 실제로 코드가 불변인지 확인할 수 있습니다(사용).final등)을 클릭합니다.

둘째, Clojure의 영구 컬렉션(제너릭 추가)을 제공하고 컬렉션에 추가된 요소를 불변하게 합니다.이것들의 성능은 꽤 좋은 것 같습니다.수집은 모두 불변이지만 검사를 위해 Java 수집 인터페이스(및 제네릭)를 구현합니다.변환은 새 컬렉션을 반환합니다.

면책사항:제가 개발자입니다.

Java 9 이전에는 Collections.unmodifyableXX() 메서드를 사용하여 변경할 수 없는 컬렉션을 만듭니다.이러한 메서드는 원래 컬렉션의 수정 불가능한 보기 또는 읽기 전용 보기를 반환하는 래퍼 메서드와 같이 작동합니다. 즉, 이러한 래퍼 메서드에 의해 반환된 참조를 통해 추가, 제거, 교체, 지우기 등의 수정 작업을 수행할 수 없습니다.그러나 원본 컬렉션에 대한 다른 참조가 있는 경우 원래 컬렉션을 수정할 수 있으며 이러한 수정 내용이 이러한 메서드에 의해 반환된 보기에 반영됩니다.

예를들면,

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
 
public class Java9ImmutableCollections 
{
    public static void main(String[] args) 
    {
        List<String> sportList = new ArrayList<String>();
         
        sportList.add("Hockey");
        sportList.add("Cricket");
        sportList.add("Tennis");
         
        List<String> unModifiableSportList = Collections.unmodifiableList(sportList);
 
        System.out.println(sportList);    //Output : [Hockey, Cricket, Tennis]
         
        System.out.println(unModifiableSportList);    //Output : [Hockey, Cricket, Tennis]
         
        unModifiableSportList.add("Wrestling");     //It gives run-time error
         
        sportList.add("Kabaddi");      //It gives no error and will be reflected in unModifiableSportList
         
        System.out.println(sportList);    //Output : [Hockey, Cricket, Tennis, Kabaddi]
         
        System.out.println(unModifiableSportList);    //Output : [Hockey, Cricket, Tennis, Kabaddi]
         
    }
}

Java 9부터는 고정 팩토리 메서드가 도입되어 불변의 컬렉션을 작성합니다.

1) Immutable List : List.of()
2) Immutable Set : Set.of()
3) Immutable Map : Map.of() or Map.ofEntries()

불변과 수정 불가:

Java 9 Collections.unmodifiedXX() 래퍼 메서드에서 반환되는 불변 컬렉션과 수정 불가능한 컬렉션은 다릅니다.수정할 수 없는 컬렉션은 원래 컬렉션의 읽기 전용 보기입니다.원래 컬렉션에서 수정 작업을 수행할 수 있으며 이러한 수정 내용은 이러한 메서드에 의해 반환된 컬렉션에 반영됩니다.단, Java 9의 스태틱팩토리 메서드에 의해 반환되는 불변의 컬렉션은 100% 불변입니다.일단 작성되면 수정할 수 없습니다.

출처 : https://javaconceptoftheday.com/java-9-immutable-collections/

언급URL : https://stackoverflow.com/questions/7713274/java-immutable-collections

반응형