[교재 EffectiveJava] 아이템 15-예제. static final array 변경하지 못하도록 설정하기

반응형
728x90
반응형

길이가 0 이상일 경우 변경 가능한 public static final array

public class ArrayTest {
    public static final int[] VALUES = {1, 2, 3, 4};
}

 

값을 변경해보자
public class Main {
    public static void main(String[] args) {
        System.out.println(ArrayTest.VALUES[0]); // 1
        ArrayTest.VALUES[0] = 5;

        /* 변경이 된다 */
        System.out.println(ArrayTest.VALUES[0]); // 5
    }
}

 

 

 

해결방안 1

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ArrayTest2 {
    private static final Integer[] VALUES = {1, 2, 3, 4};

    /* 수정 불가능한 리스트 */
    public static final List<Integer> VALUE_LIST
            = Collections.unmodifiableList(Arrays.asList(VALUES));
}

 

변경할 수 없는 리스트
public class Main {
    public static void main(String[] args) {
        /* 변경 시도시 에러 발생 */
        // ArrayTest2.VALUE_LIST.set(0, 5)
        System.out.println(ArrayTest2.VALUE_LIST.get(0));
    }
}

 

 

 

해결방안 2

public class ArrayTest3 {
    private static final int[] VALUES = {1, 2, 3, 4};

    /* 배열 복사 (깊은복사 clone) */
    public static final int[] getValues() {
        return VALUES.clone();
    }
}

 

새롭게 복사된 배열 받기
public class Main {
    public static void main(String[] args) {
        /* copyArr 원소를 변경해도 ArrayTest3.VALUES 와는 무관 */
        int[] copyArr = ArrayTest3.getValues();
        System.out.println(copyArr[0]);
    }
}

 

 

 

반응형

Designed by JB FACTORY