2013-08-22 4 views
6

나는 어떤 언어로든 액세스 제어 기능을 좋아하지만 자바에서는 접근 수정 자 (또는 그 부족함)를 거의 사용하지 않는다는 것을 알게되었습니다 (package-private).Java에서 package-private은 언제 사용합니까?

나는 내부 클래스는 private, protected, 또는 package-private이 될 수 있다는 걸,하지만 외부 클래스는 package-private 또는 public 될 수 있습니다. 왜 외부 클래스가 package-private 일 수 있지만 protected이 아닌지? 클래스/메소드/필드를 하위 클래스가 아닌 전체 패키지에서 볼 수 있도록 제한하는 이점은 무엇입니까?

답변

13

패키지 외부의 사용자 (및 다른 클래스)의 구현 세부 사항을 숨기려면 package-private 클래스 및 메소드를 사용합니다.

예를 들어 인터페이스 및 해당 인터페이스의 인스턴스를 생성하는 팩토리 클래스가있는 경우 구현 클래스를 별도의 파일로 가질 수 있지만 다른 사용자가 사용할 수 없도록 패키지 전용으로 표시하거나 JavaDoc (javadoc가 공개만을 표시하도록 설정된 경우).

jar 파일을 봉인하는 경우 package-private 메소드는 누가이 메소드에 액세스 할 수 있는지 제한하는 데 도움이 될 수 있습니다. 메소드가 public 또는 protected 인 경우 하위 클래스는 다른 패키지에 있어도 해당 메소드를보고 호출 할 수 있습니다. (봉인되지 않은 jar는 누구나 package-private 또는 protected 메소드에 액세스 할 수 있도록 패키지에 클래스를 만들 수 있습니다.)

2

대부분의 경우 동일한 패키지의 피어 클래스는 동일한 작성자를 가지므로 내부 방법 이러한 클래스는 작동합니다. 즉,이 클래스의 캡슐화 된 논리를 알고 있습니다. 따라서 그는 클래스 간의 패키지 - 개인 액세스가 액세스 된 클래스의 캡슐화 된 논리를 따르고 이러한 액세스가 아무 것도 깨뜨리지 않도록 할 수 있습니다.

이러한 직접 액세스는 종종 최적화와 소스 코드의 양을 줄이는 데 유용합니다.

왜 외부 클래스가 패키지 개인 일지 모르지만 보호되지 않는 질문에 대해서는 대답이 없습니다.