Paketinhalte
Der Inhalt des Pakets sollte sorgfältig so gestaltet werden, dass sie nur funktional relevante Klassen und Schnittstellen enthalten. Klassen im Paket können frei auf nicht private Mitglieder anderer Klassen im Paket zugreifen, und einige Klassen haben möglicherweise sogar über ausreichende Berechtigungen, um auf interne Details anderer Klassen zuzugreifen. Um solche Klassen von falsch operierenden Klassenmitgliedern zu vermeiden, müssen wir Klassenmitglieder schützen. Jedes Mitglied, das nicht als privat erklärt wird, kann von allen anderen Typen im selben Paket zugegriffen werden, sodass alle nicht verwandten Klassen eher koordiniert sind als wir erwarten würden.
Pakete bieten auch logische Gruppierung für Programmierer, die nach nützlichen Schnittstellen und Klassen suchen. Pakete, die aus irrelevanten Klassen bestehen, erschweren den Programmierern es schwierig zu sagen, welche Schnittstellen und Klassen nützlich sind, und die logische Gruppierung von Klassen kann den Programmierern helfen, Code wiederzuverwenden, da Programmierer, was sie durch logische Gruppierung leichter benötigen, einfacher finden können. Wenn das Paket nur verwandte, eng gekoppelte Typ -Sets enthält, bedeutet dies, dass wir dem Typ einige intuitivere Namen geben können, um Namenskonflikte zu vermeiden.
Pakete können verschachtelt werden. Zum Beispiel ist Java.lang ein verschachteltes Paket, in dem das Paket Lang in größerem Paket Java verschachtelt ist, während das Paket J AVA auch einige andere Pakete enthält. Durch Nisting bilden die zugehörigen Pakete ein Namenssystem mit hierarchischer Struktur.
Um beispielsweise eine Reihe von Paketen für adaptive Systeme wie neuronale Netzwerke und genetische Algorithmen zu erstellen, können wir Pakete mit dot-getrennten Namen benennen, um verschachtelte Pakete zu erstellen:
Paket adaptiv. neuronales Netz;
Die Quelldatei mit der oben genannten Deklarationsanweisung befindet sich im adaptiven.neuralNet -Paket, und das adaptive.neuralNet -Paket selbst ist ein Unterpackung des adaptiven Pakets. Das adaptive Paket kann einige Klassen enthalten, die sich auf allgemeine adaptive Algorithmen beziehen, wie z. Pakete, die sich in einer tieferen Position in der Hierarchie befinden (z. B. adaptiv.neu-ralnet oder adaptive.genetic), enthalten Klassen, die sich auf einen bestimmten Typ von adaptivem Algorithmus beziehen.
Die Verschachtelung von Paketen ist nur ein Werkzeug für die Organisation der zugehörigen Pakete und bietet keine speziellen Zugriffsrechte zwischen Paketen.
Der Klassencode im adaptiven Paket kann nicht auf die Mitglieder im adaptiven oder adaptiven.neuralnet -Paket zugreifen, das Paketzugriffsrechte verfügt, und der Paketumfang ist nur für bestimmte Pakete anwendbar. Die Verschachtelung von Paketen kann relevante Pakete gruppieren und Programmierern helfen, die gewünschte Klasse auf logischer Ebene bequemer zu finden, aber darüber hinaus bringt sie keine anderen Vorteile mit sich.
Paketnotizen
Das Paket kann auch Anmerkungen haben. Das Problem ist jedoch, dass Pakete, da Pakete eine Organisationsstruktur sind und keine Quellcode -Entitäten haben und keine tatsächliche Definition haben, nicht wie Klassen oder Methoden kommentiert werden können. Daher kann die Anmerkung des Pakets nur durch Anmerkungen der Deklarationsanweisung des Pakets in der Quelldatei erreicht werden. In jedem Paket kann es jedoch nur eine Paketerklärung geben, die Anmerkungen haben, die darauf reagieren.
Wie kommst du Pakete an? Tatsächlich zwingt Java die Programmierer nicht, mit der Regel "Einzelanträge für Paketanweisungen" zu befassen. Die empfohlene Möglichkeit besteht darin, eine Datei mit dem Namen Package-I nfo.java im Paketverzeichnis zu erstellen, in dem nur die Paketanweisungen und Anmerkungen des Pakets gespeichert werden, ohne etwas anderes zu platzieren. Beispielsweise sieht die Paket info.java -Datei für das ATT -Paket so aus:
@PackageSpec (Name zwei "Attr-Projekt", Version = "1.0" @DevelopmentSite ("attr.project.org") @DevelopmentModel ("Open-Source") Paket Attr;PackageSpec, Entwicklungs- und Entwicklungs -Opmentmodel werden verwendet, um Annotationstypen zu ändern. Natürlich haben sie Laufzeitsparstrategien. Paket-info.java-Datei sollte mit anderen Quelldateien im Paket kompiliert werden.
Wir empfehlen, alle paketbezogenen Informationen in die Paketinfo.java-Datei zu platzieren. Wenn Sie dies tun, können Sie zu Beginn der Datei Dokumentenkommentare platzieren, damit diese Dokumente als Paketdokumente kommentiert werden.
Paketobjekte und Spezifikationen
Pakete implementieren normalerweise einige Spezifikationen und stammen normalerweise aus einer Organisation. Paketobjekte unterscheiden sich von anderen Reflexionstypen und können nicht zum Erstellen oder Betrieb von Paketen verwendet werden. Sie können jedoch nur als Wissensbasis für die Bereitstellung von Informationen dienen, die Informationen zu den vom Paket implementierten Spezifikationen (Titel, Anbieter und Versionsnummer der Spezifikation) und Informationen zur Implementierung des Pakets selbst (Titel, Anbieter und Versionsnummer des Pakets) enthalten. Obwohl Pakete normalerweise von einzelnen Organisationen stammen, können die von ihnen implementierten Spezifikationen (z. B. Bibliotheken für statistische Analyse) von anderen Organisationen definiert werden. Programme, die Pakete verwenden, müssen möglicherweise die Version der vom Paket implementierten Spezifikation kennen, sodass Funktionen, die nur in einer bestimmten Version definiert sind, verwendet werden können. In ähnlicher Weise müssen diese Programme möglicherweise auch wissen, welche Implementierungsversion ihnen bereitgestellt wird, hauptsächlich, um mögliche Fehler in verschiedenen Versionen zu bewältigen. Einige der Hauptmethoden der Paketklasse ermöglichen den Zugriff auf diese Informationen:
Wenn Sie diese Informationen beispielsweise aus dem Java.lang -Paket in unserem System extrahieren, erhalten Sie die folgenden Ergebnisse: '
Spezifikationstitel: Java -Plattform -API -Spezifikation Spezifikation Version: 1.4 Spezifikationsanbieter: Sun Microsystems, Inc. Implementierung Titel: Java Runtime Environment Implementierung Version: 1.5.0_02 Implementierungsanbieter: Sun Microsystems, Inc.
Die kanonische Versionsnummer besteht aus nicht negativen Zahlen, die durch Periodengrenzwerte wie "2.0" oder '11 .0.12 "getrennt sind. Mit diesem Muster können wir die Methode iscompatible mit der Methode aufrufen, um die Versionsnummer zu vergleichen, die diesem Muster mit der Versionsnummer des Pakets folgt. Wenn die Versionsnummer des Pakets größer oder gleich der Versionsnummer des Nachfolgers ist, gibt die Methode true zurück. Dieser Vergleich vergleicht nur eine period getrennte Zahl gleichzeitig. Wenn eine dieser Zahlen kleiner als die entsprechende Position in der übergebenen Versionsnummer ist, sind die beiden Versionen nicht kompatibel. Wenn eine der Versionsnummern länger als der andere ist, wird der fehlende Teil in den Kurzversionsnummern als Null angesehen. Wenn beispielsweise die kanonische Versionsnummer des Pakets "1.4" ist und wir es mit "1.2", "1.3.1 'oder" .1.81. Vergleiche, wird True zurückgegeben. Im Vergleich zu "1.4.2 'oder" .5 "wird jedoch falsch zurückgegeben. Diese Schlussfolgerung wird gezogen, da dieser Vergleichsmechanismus davon ausgeht, dass die Spezifikationsversion rückwärts kompatibel ist.
Es gibt kein bestimmtes Format für die Implementierungsversionsnummer, da verschiedene Organisationen, die die Implementierung anbieten, die Implementierungsversion unterschiedlich definieren. Der einzige Vergleich, der zwischen Implementierungsversionen durchgeführt werden kann, besteht darin, zu testen, ob die Version gleich ist, wenn keine Annahme einer Rückwärtskompatibilität besteht.
Das Paket kann versiegelt werden, was bedeutet, dass Klassen nicht mehr zum Paket hinzugefügt werden können. Unversiegelte Pakete können Klassen von mehreren verschiedenen Standorten im Klassensuchpfad enthalten, während der Inhalt des versiegelten Pakets vom selben Ort stammen muss - entweder ein bestimmtes Archiv oder ein von einer URL angegebener Ort. Es gibt zwei Möglichkeiten, um festzustellen, ob ein Paket versiegelt ist:
.Public Boolean idealed p: Return trueo Wenn das Paket versiegelt ist
.Public boolean issealed (URL -URL): Rückgabe true Wenn das Paket für die angegebene URL versiegelt ist, können die Klassen im Paket von dieser gegebenen URL geladen werden. Wenn die Klasse im Paket nicht aus der angegebenen URL geladen werden kann oder das Paket nicht versiegelt ist, wird Falsch zurückgegeben, und die Spezifikation und Implementierungsinformationen des Pakets werden normalerweise als Teil der mit dem Paket gespeicherten Manifestdatei bereitgestellt - beispielsweise als Teil der Manifest -Datei in einem Java -Archiv (JAR), wie in Abschnitt 25.9.2, „Archivdatei Java.util.JAR“. Wenn eine Klasse in einem Paket geladen wird, werden diese Informationen von der Person gelesen. Ein Klassenloader kann ein Paketobjekt für die Klasse, die er laden möchte, dynamisch definieren:
Wir können die Getpackage -Methode des Klassenobjekts der angegebenen Klasse aufrufen, um das Paketobjekt dieser Klasse zu erhalten. Wir können auch das statische Paket anrufen. Beide Methoden beziehen sich auf den Klassenlader, der ihren Code aufruft, da diese Codes die Get-Package- oder Getpackages-Methoden ihres Klassenladers aufrufen. Diese Methoden der Klassenlader suchen nach einem bestimmten Klassenlader und allen seinen übergeordneten Klassenladern. Wenn für den aktuellen Klassenlader keine Einstellungen vorgenommen werden, wird der Systemklassenlader zu diesem Zeitpunkt verwendet. Beachten Sie, dass die Klassenladermethode, wenn das Paket unbekannt ist, NULL zurückgibt, da zu diesem Zeitpunkt kein Typ im Paket geladen wurde.