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
를 사용하지 않고이 목적을 위해 존재 하는 Guava 의 ImmutableList 를 사용 하는 것입니다.
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"});
}
답변
답변
‘java.lang.Integer’대신 네이티브 ‘int’가 (성능상의 이유로 또는 메모리를 절약하기 위해) 필요한 경우 자체 래퍼 클래스를 작성해야 할 것입니다. 인터넷에는 다양한 IntArray 구현이 있지만 Koders IntArray , Lucene IntArray 과 같은 변경 불가능한 것은 없습니다 . 아마도 다른 사람들이있을 것입니다.