package-private
과 public
접근 제한자를 선언할 수 있다.
package-private
은 해당 패키지 내에서만 사용 가능package-private
를 사용하자package-private
톱레벨 클래스나 인터페이스는 이를 사용하는 클래스 안에 private static
으로 중첩시켜보자.private
으로 만들자.
final
이 아닌 인스턴스 필드를 public
으로 선언하면 필드 값을 제한할 수 없게 된다.final
을 붙이더라도 내부 구현을 바꾸는 리팩터링을 할 때 필드가 외부 컴포넌트에 노출된 코드가 있다면 코드 변경이 어려어진다.package-private
private
, package-private
은 공개 API에 영향을 주지 않는다.public
클래스의 private
멤버를 package-private
까지 푸는 것은 괜찮지만 그 이상은 안 된다.public
으로 하거나 그대로 반환하는 접근자 메서드를 제공해서는 안 된다.
public
배열을 private
으로 만들고 불변 리스트를 추가하는 방법이 있다.
rivate static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
}
반환할 때 배열을 복사하는 방법도 있다. (방어적 복사)
private static final Thing[] PRIVATE_VALUES = {...};
public static final Thing[] values() {
return PRIVATE_VALUES.clone();
}
public
, protected
여도 공개하지 않았다면 외부 모듈에서 접근할 수 없다.public
과 protected
이다.public
클래스는 어디서든 접근 가능해진다.