Safe construction techniques

의도치 않은 get 메서드 등으로 의해 private 변수가 공개되는 경우가 있다. 캡슐화가 물거품 되거나 내부 참조가 외부에 공개되어 내부 데이터의 안정성이 깨질 수 있다.

public class UnsafePrivate {
    // private final 로 선언되어 있지만
    private final String[] internalData = new String[] { "A", "B", "C" };

    // 여기서 private 가 공개된다.
    public String[] getData() {
        return internalData;
    }
}
  
public class UnsafePrivateTest {
    public static void main(String[] args) {
        UnsafePrivate unsafePrivate = new UnsafePrivate();

        // 그리고 여기서 오염이 된다 = 스레드 안정성이 깨질 수 있다
        unsafePrivate.getData()[0] = "Z";

        System.out.println(unsafePrivate.getData()[0]);
    }
}

내부 참조형 자료를 공개해야할 경우에는 내부상태가 공유되지 않도록 유의한다