Item 13. 클래스와 멤버의 접근 권한은 최소화하라
잘 설계된 모듈은 구현 세부사항을 잘 감추느냐의 여부다. 이를 정보은닉(imformation hiding) 또는 캡슐화(encapsulation)이라 한다.
결론먼저 말하면, public static final을 제외한 어떤 필드로 public으로 만들지 마라.
그리고 public static final 필드가 참조하는 객체는 변경 불가능 객체로 만들어라.
정보은닉을 왜 하느냐
- 의존성 최소화
- 각 모듈 사이의 의존성을 낮춰서 각자 개별적으로 개발, 시험, 최적화,이해, 변경
- 각 모듈의 병렬 개발 가능
- 유지 보수의 용이
- 재사용 가능
- 다른 모듈과는 관계가 없으므로, 어디든 재사용 가능하
-> 즉, 각 클래스와 멤버는 가능한 한 접근 불가능하도록 만들라! 단, 정상동작을 보증하는 한도 내에서..
필드, 메서드, 중첩클래스, 중첩 인터페이스의 접근 권한
- private - 선언된 최상위 레벨 클래스 내부에서만 접근 가능
- package-privates - 같은 패키지 내의 아무 클래스나 사용 가능
- protected - 같은 패키지, 선언된 클래스 및 그 하위 클래스만 사용
- public - 어디서나 사용 가능
이런 건 절대 하지 마라!
객체 필드(instance field)는 절대로 public으로 선언하지 마라!
- public으로 선언하면 필드에 저장 된 값을 제한 할 수 없다. (메서드를 통하지 않고도 직접 필드값 변경 가능하기 때문)
즉, 변경가능 public 필드를 가진 클래스는 다중 스레드에 안전하지 않다.
but, 핵심적 부분을 구성한다고 판단되는 경우는 public static final 상수로 선언해서 공개는 가능
- public으로 선언하면 필드에 저장 된 값을 제한 할 수 없다. (메서드를 통하지 않고도 직접 필드값 변경 가능하기 때문)
길이가 0이 아닌 배열은 언제나 변경 가능하므로,
- public static final 배열 필드를 두면 앙대
- 배열 필드를 반환하는 접근자를 정의하면 앙대