패키지의 이름 지정
패키지 이름은 다른 패키지와의 충돌을 피해야하므로 의미 있고 독특한 이름을 선택하는 것은 패키지 디자인의 중요한 측면입니다. 그러나 전 세계의 프로그래머가 패키지를 개발하고 있으며 누가 패키지 이름을 사용했는지 알 수있는 방법이 없으므로 유일한 패키지 이름을 선택하는 것은 문제입니다. 패키지가 조직 내에서만 사용된다고 판단하면 프로젝트 간의 이름 충돌이 없는지 확인하기 위해 내부 중재인을 가질 수 있습니다.
그러나 전 세계의 경우이 접근법은 실용적이지 않습니다. 패키지 식별자는 모두 간단한 이름이며 패키지 이름이 인터넷 도메인 이름을 사용하는 것이 더 나은 방법입니다. 우리가 일하는 회사가 Magic.lnc이고 회사의 도메인 이름이 Magic C.com이면 속성 패키지의 선언은 다음과 같습니다.
패키지 com.magic.attr; 여기서 도메인 이름 구성 요소는 기존 도메인 이름의 역 순서로 배열됩니다.
우리 가이 관용구를 채택하면, 우리가 사용하는 패키지 이름은 조직 내의 갈등을 제외하고 다른 사람과 충돌하지 않습니다. 우리 조직 (아마도 대규모 기업) 내에 충돌이 실제로 있다면, 우리는보다 구체적인 도메인 이름을 사용하여 더 많은 자격을 갖추 수 있습니다. 많은 대기업에게는 동부 및 유럽과 같은 내부 하위 도메인이 있으며, 이는 패키지 이름을 추가로 예약하는 데 사용할 수 있습니다.
Package Corn.magic.japan.attr;
이 솔루션을 사용하면 패키지 이름을 매우 길게 만들 수 있지만 비교적 안전합니다. 이 기술을 사용하는 프로그래머는 동일한 패키지 이름을 선택하지 않으며이 기술을 사용하지 않는 프로그래머는 우리가 사용하는 이름을 선택하지 않습니다.
패키지 액세스
패키지에서 최상위 클래스 및 최상위 인터페이스의 접근성을 선언 할 때는 패키지 액세스 (패키지)와 공개 액세스 (공개)의 두 가지 옵션이 있습니다. 공개적으로 수정 된 클래스 또는 인터페이스는 패키지 외 코드로 액세스 할 수 있으며, 공개로 장식되지 않은 유형에는 패키지 범위가 있습니다. 동일한 패키지의 다른 코드로 액세스 할 수 있습니다. 그러나 그들은 포장되지 않은 코드, 서브 포장 코드에도 숨겨져 있습니다. 유형을 선언 할 때는 다른 프로그래머가 공개적으로 사용해야하는 유형을 선언하고 패키지의 구현 세부 정보에 속하는 유형을 숨기려면됩니다. 이 기술은 우리에게 큰 유연성을 제공하며 프로그래머는 액세스 할 수없는 이러한 유형의 구현 세부 사항에 의존하지 않기 때문에 구현 세부 정보를 변경하려면 자유롭게 변경할 수 있습니다.
공개, 보호 또는 개인으로 선언되지 않은 클래스 멤버는 패키지 내부의 모든 코드에서 직접 액세스 할 수 있지만 패키지 외부에서 숨겨져 있습니다. 다시 말해, 기본 액세스 수정자는 인터페이스의 멤버를 제외하고 "패키지"이며 기본 액세스 수정자는 "공개"입니다.
패키지 내에서 비공개로 선언되지 않은 필드 또는 메소드는 해당 패키지의 다른 모든 코드에서 액세스 할 수 있으므로 동일한 패키지의 클래스는 "친숙한"또는 "신뢰할 수있는"것으로 간주됩니다. 이를 통해 사전 정의 된 코드와 자리 표시 자 코드를 결합한 애플리케이션 프레임 워크를 정의 할 수 있습니다. 여기서 자리 표시 자 코드는 프레임 워크 클래스의 서브 클래스로 재정의됩니다. 사전 정의 된 코드는 패키지 액세스 수정자를 사용하여 패키지 내의 다른 협업 코드가 직접 액세스 할 수 있지만 패키지 외 사용자의 경우 이러한 코드는 액세스 할 수 없습니다. 그러나이 코드가 위치한 패키지의 서브 포장은 신뢰할 수 없으며 그 반대도 마찬가지입니다. 예를 들어, 패키지 DIT의 패키지 액세스 수정 자로 수정 된 코드는 하위 패키지 Dit.dat의 코드에서 액세스 할 수 없으며 그 반대도 마찬가지입니다.
따라서 각 유형은 세 가지 계약을 정의합니다.
접근성 및 표지 방법
슈퍼 클래스에서 액세스 할 수있는 메소드 만 서브 클래스로 덮어 쓸 수 있습니다. 슈퍼 클래스의 메소드에 액세스 할 수없는 경우 서브 클래스의 메소드가 메소드와 동일한 이름을 갖는 경우에도 서브 클래스에서 메소드를 재정의 할 수 없습니다. 런타임에 메소드가 호출되면 시스템은 접근성을 고려하여 실행중인 구현을 결정합니다.
특별히 구성된 예제는 더 명확하게 설명됩니다. P1 패키지에서 추상 기반 클래스를 선언한다고 가정 해 봅시다.
패키지 P1; {ab ab abab public acc show () pri (); pac (); 찬성(); 선술집(); }}이 클래스에서는 각각 다른 액세스 수정자가있는 4 가지 방법을 정의하고 방법의 본문은 자체 만 식별합니다. 이 메소드 쇼는 현재 객체 에서이 4 가지 메소드를 차례로 호출합니다. 이 메소드를 다른 서브 클래스 객체에 적용 할 때 이러한 방법의 구현이 호출되는 것을 설명 할 수 있습니다.
이제 우리는 AbstractBase 클래스를 확장하는 클래스 Concretel을 정의하지만 P2 패키지에 있습니다.
패키지 P2; P1.ABSTRANTBASE Public Class Concretel은 AbstractBase를 확장합니다 {public void pri () {print ( "Concretel.pri ()";} public void pac () {print ( "concretel.pac ()"); }슈퍼 클래스의 4 가지 방법은이 클래스에서 다시 고정되고 구현이 변경되어 Con-Cretel 클래스에 속한다고보고합니다. 동시에 다른 코드에 액세스 할 수 있도록 액세스 권한이 공개되었습니다. 다음 코드를 실행하십시오
New Concretel (). show () :
다음 출력이 생성됩니다.
AbstractBase.pri () AbstractBase.pac () Concretel.pro () Concretel.pub ()
개인 메소드 PRI는 서브 클래스 (또는 다른 클래스)로 액세스 할 수 없으므로 쇼 메소드는 항상 AbstractBase 클래스에서 PRI 메소드의 구현을 호출합니다. AbstractBase 클래스에 패키지 액세스 권한이있는 PAC 메소드는 Concretel에서 액세스 할 수 없으므로 Concretel 클래스에서 PAC 메소드의 구현은 AbstractBase 클래스에서 정의를 무시할 수 없으므로 Show 메소드는 AbstractBase.pac 메서드를 호출합니다. Pro Method와 Pub 방법은 Concretel 클래스에서 모두 액세스 할 수 있으며 덮어 쓰기도 할 수 있으므로 Show Method는 Concretel 클래스 에서이 두 가지 메소드의 구현을 호출합니다.
우리의 발 의미 클래스 Concrete2를 따라 클래스 Concretel을 확장 한 다음 AbstractBase 클래스와 동일한 패키지 P1에 넣습니다. '
패키지 P1; Procletel {public void pri () {print ( "concrete2.pri ()";} public void pac () {print ( "concrete2.pac ()")} public void pro () {print ( "concrete2.pro ()"); public void pub () {print ( "print (") {print ( "print (") {print ( ")Concretel의 방법에는 공공 접근 권한이 있기 때문에 Concrete2에서 액세스 할 수 있으며 Concrete2의 각 방법은 해당 방법을 개별적으로 다룹니다. 또한 Concrete2 및 AbstractBase는 동일한 패키지에 있으므로 AbstractBase.pac 방법은 Concrete2에서도 액세스 할 수 있으며 Method Concrete2.pac을 재정의 할 수 있습니다. Concrete2 객체에서 쇼 메소드를 호출하면 인쇄 결과는 다음과 같습니다.
AbstractBase.pri () Concrete2.pac () Concrete2.pro () Concrete2.pub ()
마지막으로, 클래스 콘크리트 3을 정의하여 클래스 Concrete2를 확장하고 패키지 p3에 넣습니다.
패키지 P3 가져 오기 P1.concrete2; Public Class Concrete3은 Concrete2 {public void pri () {print ( "concrete3.pri ()";} public void pac q {print ( "concrete3.pac ()");} public void pro () {print ( "contrete3.pro ()");} public void pub () {print (contrete3.pub () "; 인쇄 결과는 다음과 같습니다. AbstractBase.pri () Concrete3.pac () Concrete3.pro () Concrete3.pub ()여기서 Method Concrete3.pac은 접근 가능한 AbstractBase.pac 메서드를 무시하는 것처럼 보이지만 실제로 Method Concrete3.Pac은 Method Concrete2.pac을 재정의하고 Method Concrete2.pac는 Method AbstractBase.pac를 재정의하므로 Method AbstractBase.pac을 간접적으로 무시합니다. Class Concrete2의 PAC 방법을 공개 액세스 권한을 갖는 것으로 재고함으로써 모든 서브 클래스로 액세스하고 덮어 쓸 수 있습니다. '