패키지 콘텐츠
패키지의 내용은 기능적으로 관련된 클래스와 인터페이스 만 포함하도록 신중하게 설계되어야합니다. 패키지의 클래스는 패키지의 다른 클래스의 비 개인적인 구성원에게 자유롭게 액세스 할 수 있으며 일부 클래스는 다른 클래스의 내부 세부 사항에 액세스하기에 충분한 권한이있을 수 있습니다. 이러한 수업이 수업 회원을 오해하는 것을 피하려면 클래스 멤버를 보호해야합니다. 비공개로 선언되지 않은 모든 회원은 동일한 패키지의 다른 모든 유형에서 액세스 할 수 있으므로 관련없는 클래스는 예상보다 더 조정될 가능성이 높습니다.
패키지는 또한 유용한 인터페이스 및 클래스를 찾는 프로그래머를위한 논리적 그룹화를 제공합니다. 관련이없는 클래스로 구성된 패키지는 프로그래머가 어떤 인터페이스와 클래스가 유용한 지 알기가 어렵고, 논리적 인 클래스 그룹화는 프로그래머가 논리적 그룹화를 통해 더 쉽게 필요한 것을 찾을 수 있기 때문에 프로그래머 재사용 코드를 도울 수 있습니다. 패키지에 관련적이고 밀접하게 연결된 유형 세트 만 포함 된 경우 유형에 이름 충돌을 피하기 위해 더 직관적 인 이름을 제공 할 수 있습니다.
패키지는 중첩 될 수 있습니다. 예를 들어, Java.lang은 패키지 Lang이 더 큰 패키지 Java에 중첩되어있는 중첩 패키지이며, Java 패키지에는 다른 패키지도 포함되어 있습니다. 중첩은 관련 패키지가 계층 구조를 가진 명명 시스템을 형성합니다.
예를 들어, 신경망 및 유전자 알고리즘과 같은 적응 형 시스템을위한 패키지 세트를 만들려면 중첩 된 패키지를 만들기 위해 도트 구분 이름이있는 패키지를 지명 할 수 있습니다.
패키지 적응 형. 신경 그물;
위의 선언문을 포함하는 소스 파일은 Adaptive.neuralnet 패키지에 있으며 Adaptive.neuralnet 패키지 자체는 적응 형 패키지의 하위 포장입니다. 적응 형 패키지에는 일반화 문제 설명 클래스 또는 벤치 마크 클래스와 같은 일반적인 적응 알고리즘과 관련된 일부 클래스가 포함될 수 있습니다. 계층 구조에서 더 깊은 위치에있는 패키지 (예 : Adaptive.neu-Ralnet 또는 Adaptive.genetic)에는 특정 유형의 적응 형 알고리즘과 관련된 클래스가 포함되어 있습니다.
패키지의 중첩은 관련 패키지를 구성하는 도구 일뿐 아니라 패키지간에 특별한 액세스 권한을 제공하지 않습니다.
Adaptive.genetic 패키지의 클래스 코드는 패키지 액세스 권한이있는 Adaptive 또는 Adaptive.neuralnet 패키지의 구성원에게 액세스 할 수 없으며 패키지 범위는 특정 패키지에만 적용됩니다. 패키지의 중첩은 관련 패키지를 그룹화하고 프로그래머가 원하는 클래스를 논리적 수준에서 더 편리하게 찾는 데 도움이 될 수 있지만 그 외에도 다른 이점을 가져 오지 않습니다.
패키지 노트
패키지에는 주석이있을 수도 있습니다. 그러나 문제는 패키지에 조직 구조이며 소스 코드 엔티티가없고 실제 정의가 없으므로 클래스 나 방법처럼 주석을 달 수 없다는 것입니다. 따라서 패키지 주석은 소스 파일에 패키지의 선언문에 주석을 달 때만 달성 할 수 있습니다. 그러나 각 패키지에는 하나의 패키지 선언 만있을 수 있으며, 이에 대한 주석이있는 주석이있을 수 있습니다.
그렇다면 패키지에 어떻게 주석을 달 수 있습니까? 실제로 Java는 프로그래머가 "단일 주석이 달린 패키지 문"규칙을 다루기 위해 어떤 방법을 사용하도록 강요하지 않습니다. 권장되는 방법은 패키지 디렉토리에서 package-i nfo.java라는 파일을 만드는 것입니다. 여기서 패키지 문과 패키지의 주석 만 다른 것을 배치하지 않고 저장됩니다. 예를 들어, att
@packagespec (이름 2 "attr project", version = "1.0"@developmentite ( "attr.project.org") @developmentModel ( "Open-Source") 패키지 attr;
PackagesPec, Developments 및 Development OpmentModel은 주석 유형을 수정하는 데 사용됩니다. 물론, 그들은 런타임 절약 전략을 가지고 있습니다. Package-Info.java 파일은 패키지의 다른 소스 파일과 함께 컴파일해야합니다.
모든 패키지 관련 정보를 Package-Info.java 파일에 배치하는 것이 좋습니다. 이렇게하면 파일의 시작 부분에 문서 주석을 배치하여 이러한 문서가 패키지 문서로 주석을 달 수 있습니다.
패키지 개체 및 사양
패키지는 일반적으로 일부 사양을 구현하며 일반적으로 조직에서 나옵니다. 패키지 개체는 다른 반사 유형과 다르며 패키지를 만들거나 작동하는 데 사용할 수 없지만 패키지에서 구현 된 사양 (사양의 제목, 공급 업체 및 버전 번호)에 대한 정보와 패키지 자체의 구현에 대한 정보 (제목, 공급 업체 및 패키지 번호)에 대한 정보를 제공하는 정보를 제공하기위한 지식 기반으로 만 사용될 수 있습니다. 패키지는 일반적으로 개별 조직에서 나오지만, 통계 분석 라이브러리와 같은 사양은 다른 조직에서 정의 할 수 있습니다. 패키지를 사용하는 프로그램은 패키지에서 구현 한 사양의 버전을 알아야하므로 특정 버전에서만 정의 된 기능을 사용할 수 있습니다. 마찬가지로, 이러한 프로그램은 주로 다른 버전의 가능한 결함을 처리하기 위해 어떤 구현 버전이 제공되는지 알아야 할 수도 있습니다. 패키지 클래스의 주요 방법 중 일부는이 정보에 액세스 할 수 있습니다.
예를 들어, 우리 시스템의 java.lang 패키지 에서이 정보를 추출하면 다음과 같은 결과를 얻을 수 있습니다. '
사양 제목 : Java 플랫폼 API 사양 사양 버전 : 1.4 사양 공급 업체 : Sun Microsystems, Inc. 구현 제목 : Java 런타임 환경 구현 버전 : 1.5.0_02 구현 공급 업체 : Sun Microsystems, Inc.
표준 버전 번호는``2.0 ''또는 '11 .0.12 '와 같은주기 구분자로 분리 된 비 음성 숫자로 구성됩니다. 이 패턴을 사용하면 iscompatiblewith 메소드를 호출 하여이 패턴을 따르는 버전 번호를 패키지의 버전 번호와 비교할 수 있습니다. 패키지의 버전 번호가 후임자의 버전 번호보다 크거나 같으면 메소드가 true를 반환합니다. 이 비교는 한 번에 기간 분리 된 숫자 만 비교합니다. 이 숫자 중 하나가 전달 된 버전 번호의 해당 위치보다 작 으면 두 버전은 호환되지 않습니다. 버전 번호 중 하나가 다른 버전보다 길면 짧은 버전 숫자의 누락 된 부분은 0으로 간주됩니다. 예를 들어, 패키지의 표준 버전 번호가 "1.4"이고 "1.2", "1.3.1 '. 또는".1.81.와 비교하면 true가 반환됩니다. 그러나 "1.4.2 '. 또는".5 "와 비교하면 거짓이 반환됩니다.이 결론은 사양 버전과 호환 가능하다고 가정하기 때문에이 결론이 그려집니다.
구현을 제공하는 다른 조직이 구현 버전을 다르게 정의하기 때문에 구현 버전 번호에는 지정된 형식이 없습니다. 구현 버전간에 이루어질 수있는 유일한 비교는 버전이 동일한 지, 후진 호환성의 가정이 없는지 테스트하는 것입니다.
패키지를 봉인 할 수 있으므로 클래스를 더 이상 패키지에 추가 할 수 없습니다. 언급되지 않은 패키지에는 클래스 검색 경로의 여러 다른 위치의 클래스가 포함될 수있는 반면, 봉인 된 패키지의 내용은 특정 아카이브 또는 URL로 지정된 위치에 있어야합니다. 패키지가 봉인되었는지 확인하는 두 가지 방법이 있습니다.
.public boolean issealed p : 패키지가 봉인 된 경우 Trueo를 반환합니다.
.public boolean issealed (URL URL) : 주어진 URL에 대해 패키지가 밀봉 된 경우, 즉 패키지의 클래스를 주어진 URL에서로드 할 수 있습니다. 패키지의 클래스를 주어진 URL에서로드 할 수 없거나 패키지가 밀봉되지 않은 경우 False가 반환되고 패키지의 사양 및 구현 정보는 일반적으로 패키지에 저장된 매니페스트 파일의 일부로 제공됩니다 (예 : 섹션 25.9.2)에 설명 된대로 Java Archive (JAR)의 일부 매니페스트 파일의 일부로 제공됩니다. 패키지의 클래스가로드되면이 정보는 사람이 읽습니다. 클래스 로더는로드하려는 클래스의 패키지 개체를 동적으로 정의 할 수 있습니다.
주어진 클래스의 클래스 객체의 getPackage 메소드를 호출 하여이 클래스의 패키지 개체를 얻을 수 있습니다. 주어진 패키지 이름으로 static package.getPackage를 호출하여 패키지 개체를 가져 오거나 정적 패키지를 호출 할 수 있습니다. 두 가지 방법 모두 코드를 호출하는 클래스 로더와 관련이 있습니다.이 코드는 클래스 로더의 get-package 또는 getpackages 메소드를 호출하기 때문입니다. 이 클래스 로더의 방법은 특정 클래스 로더 및 모든 상위 클래스 로더를 검색하며 현재 클래스 로더에 대한 설정이 없으면 현재 시스템 클래스 로더가 사용됩니다. 패키지를 알 수없는 경우 현재 패키지의 유형이로드되지 않았기 때문에 클래스 로더 메소드는 NULL을 반환합니다.