이펙티브자바 4장 클래스와 인터페이스 (1)
규칙 13. 클래스와 멤버의 접근 권한은 최소화하라
잘 구현된 모듈은 내부의 속성, 데이터, 구현 세부 사항을 잘 감추고 API로만 서로 통신한다. 이 개념은 정보 은닉 또는 캡슐화라는 용어로 통용되어 사용된다.
각 클래스와 멤버는 가능한 한 접근 불가능하도록 만들라.
private : 선언된 최상위 레벨 클래스 내부에서만 접근 가능 package-private : 같은 패키지 내의 아무 클래스나 사용할 수 있다. 기본 접근 권한(default access) protected : 선언된 클래스 및 그 하위 클래스만 사용할 수 있다. 선언된 클래스와 같은 패키지에 있는 클래스에서도 사용이 가능하다. public : 어디에서도 사용 가능 하다.
public static final 배열은 길이가 0이 아닌 이상 언제나 변경 가능 하다.
// 보안 문제를 초래할 수 있는 코드
public static final Thing[] VALUES = { ... };
해결 방법 1
private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES =
Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
해결 방법 2
private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
어떤 자료형으로 반환해야 클라이언트가 편한가?
어느 쪽이 좀더 나은 성능을 보장할 것인가?
요약
- 접근 권한은 가능한한 낮춘다.
- 최소한의 public API를 설계한 다음, 이외 모든 클래스, 인터페이스, 멤버들은 API에서 제외하라.
- public static final 필드를 제외한 어떤 필드도 public 필드로 선언하지 마라.
- public static final 필드가 참조하는 객체는 변경 불가능한 객체로 만들라.
Joshua Bloch, Effective Java 2rd, 이병준, insight(2014), p96