[java] Java의 불변 배열

Java의 기본 배열에 대한 불변의 대안이 있습니까? 기본 배열을 만드는 final것이 실제로 다음과 같은 일을 방해하지는 않습니다.

final int[] array = new int[] {0, 1, 2, 3};
array[0] = 42;

배열의 요소를 변경할 수 없도록하고 싶습니다.



답변

기본 배열에는 없습니다. List 또는 다른 데이터 구조를 사용해야합니다.

List<Integer> items = Collections.unmodifiableList(Arrays.asList(0,1,2,3));


답변

내 권장 사항은 배열이나 unmodifiableList를 사용하지 않고이 목적을 위해 존재 하는 GuavaImmutableList 를 사용 하는 것입니다.

ImmutableList<Integer> values = ImmutableList.of(0, 1, 2, 3);


답변

다른 사람들이 지적했듯이 Java에서는 불변 배열을 가질 수 없습니다.

원래 배열에 영향을 미치지 않는 배열을 반환하는 메서드가 절대적으로 필요한 경우 매번 배열을 복제해야합니다.

public int[] getFooArray() {
  return fooArray == null ? null : fooArray.clone();
}

분명히 게터를 호출 할 때마다 전체 사본을 만들므로 다소 비싸지 만 인터페이스를 변경할 수없는 경우 ( List 예를 들어 사용) 클라이언트가 내부를 변경할 위험이 없다면 필요할 수 있습니다.

이 기술을 방어 복사본 만들기라고합니다.


답변

Java에서 불변 배열을 만드는 한 가지 방법이 있습니다.

final String[] IMMUTABLE = new String[0];

요소가 0 인 배열은 분명히 변경할 수 없습니다.

List.toArray방법을 사용하여 a List를 배열 로 변환하는 경우 실제로 유용 할 수 있습니다 . 빈 배열이라도 일부 메모리를 차지하므로 상수 빈 배열을 만들어 항상 toArray메서드에 전달하여 해당 메모리 할당을 저장할 수 있습니다 . 전달하는 배열에 충분한 공간이없는 경우 해당 메소드는 새 배열을 할당하지만, 그렇지 않은 경우 (목록이 비어있는 경우) 전달한 배열을 반환하여 호출 할 때마다 해당 배열을 재사용 할 수 있습니다 toArray. 비어 List있습니다.

final static String[] EMPTY_STRING_ARRAY = new String[0];

List<String> emptyList = new ArrayList<String>();
return emptyList.toArray(EMPTY_STRING_ARRAY); // returns EMPTY_STRING_ARRAY


답변

또 다른 대답

static class ImmutableArray<T> {
    private final T[] array;

    private ImmutableArray(T[] a){
        array = Arrays.copyOf(a, a.length);
    }

    public static <T> ImmutableArray<T> from(T[] a){
        return new ImmutableArray<T>(a);
    }

    public T get(int index){
        return array[index];
    }
}

{
    final ImmutableArray<String> sample = ImmutableArray.from(new String[]{"a", "b", "c"});
}


답변

자바 당신이 사용할 수있는 9로 List.of(...), JavaDoc을 .

이 메소드는 변경 불가능 List하며 매우 효율적입니다.


답변

‘java.lang.Integer’대신 네이티브 ‘int’가 (성능상의 이유로 또는 메모리를 절약하기 위해) 필요한 경우 자체 래퍼 클래스를 작성해야 할 것입니다. 인터넷에는 다양한 IntArray 구현이 있지만 Koders IntArray , Lucene IntArray 과 같은 변경 불가능한 것은 없습니다 . 아마도 다른 사람들이있을 것입니다.