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 클래스는 어디서든 접근 가능해진다.