Contenu de package
Le contenu du package doit être soigneusement conçu pour qu'ils n'incluent que des classes et des interfaces pertinentes fonctionnelles. Les classes du package peuvent accéder librement aux membres non privés d'autres classes du package, et certaines classes peuvent même avoir des autorisations suffisantes pour accéder aux détails internes des autres classes. Afin d'éviter de telles classes des membres de la classe erronés, nous devons protéger les membres de la classe. Tout membre non déclaré comme privé est accessible par tous les autres types dans le même package, de sorte que toutes les classes non liées peuvent être plus susceptibles d'être plus coordonnées que prévu.
Les packages fournissent également un regroupement logique pour les programmeurs à la recherche d'interfaces et de classes utiles. Les packages composés de classes non pertinents rendent difficile pour les programmeurs de dire quelles interfaces et classes sont utiles, et le regroupement logique des classes peut aider les programmeurs à réutiliser le code car les programmeurs peuvent trouver ce dont ils ont besoin plus facilement grâce à un regroupement logique. Si le package ne contient que des ensembles de types liés et étroitement couplés, cela signifie que nous pouvons donner au type des noms plus intuitifs pour éviter les conflits de noms.
Les colis peuvent être imbriqués. Par exemple, Java.lang est un package imbriqué où le Lang Lang est imbriqué dans un package plus grand Java, tandis que le package J Ava contient également d'autres packages. La nidification fait que les packages associés forment un système de dénomination avec une structure hiérarchique.
Par exemple, pour créer un ensemble de packages pour les systèmes adaptatifs tels que les réseaux de neurones et les algorithmes génétiques, nous pouvons nommer des packages avec des noms séparés par DOT pour créer des packages imbriqués:
package adaptatif. neural net;
Le fichier source contenant l'instruction de déclaration ci-dessus est situé dans le package Adaptive.NuralNet, et le package Adaptive.Neralnet lui-même est un sous-package du package adaptatif. Le package adaptatif peut contenir certaines classes liées aux algorithmes adaptatifs généraux, tels que des classes de déclaration de problème de généralisation ou des classes de référence. Les packages qui sont dans une position plus profonde dans la hiérarchie (par exemple Adaptive.Neu-Ralnet ou Adaptive.Génétique) contiennent des classes liées à un type spécifique d'algorithme adaptatif.
La nidification des packages n'est qu'un outil pour organiser des packages connexes, et il ne fournit aucun droit d'accès spécial entre les packages.
Le code de classe dans le package Adaptive.Génétique ne peut pas accéder aux membres du package adaptatif ou adaptif.Neralnet qui ont des droits d'accès aux packages, et la portée du package ne s'applique qu'aux packages spécifiques. La nidification des packages peut regrouper les packages pertinents et aider les programmeurs à trouver la classe souhaitée au niveau logique plus pratique, mais au-delà, il n'apporte aucun autre avantage.
Notes de package
Le package peut également avoir des annotations. Mais le problème est que, comme les packages sont une structure organisationnelle et n'ont pas d'entités de code source et qu'ils n'ont aucune définition réelle, ils ne peuvent pas être annotés comme des classes ou des méthodes. Par conséquent, l'annotation du package ne peut être réalisée qu'en annotant l'instruction de déclaration du package dans le fichier source. Cependant, il ne peut y avoir qu'une seule déclaration de package dans chaque package qui peut avoir des annotations qui y agissent.
Alors, comment annotez-vous les packages? En fait, Java n'oblige pas les programmeurs à utiliser un moyen de gérer la règle "Instruction de package annotée unique". La manière recommandée consiste à créer un fichier nommé Package-i nfo.java dans le répertoire des packages, dans lequel seuls les instructions de package et les annotations du package sont stockées sans rien placer d'autre. Par exemple, le fichier Package Info.java pour le package ATTR ressemble à ceci:
@PackagesPec (Name Two "Astr Project", version = "1.0" @DevelopmentsIte ("att.project.org") @DevelopmentModel ("OpenSource") package att;Les packagesPEC, le site de développement et le développement OpmentModel sont utilisés pour modifier les types d'annotation. Bien sûr, ils ont des stratégies d'économie d'exécution. Le fichier package-fo.java doit être compilé avec d'autres fichiers source dans le package.
Nous vous recommandons de placer toutes les informations liées au package dans le fichier package-fo.java. Si vous faites cela, vous pouvez placer des commentaires de documents au début du fichier, afin que ces documents soient annotés comme documents de package.
Package objets et spécifications
Les packages implémentent généralement certaines spécifications et proviennent généralement d'une organisation. Les objets de package sont différents des autres types de réflexion et ne peuvent pas être utilisés pour créer ou exploiter des packages, mais ne peuvent servir que de base de connaissances pour fournir des informations, qui fournit des informations sur les spécifications implémentées par le package (le titre, le fournisseur et le numéro de version de la spécification) et les informations sur l'implémentation du package lui-même (le titre, le fournisseur et le numéro de version du package). Bien que les packages proviennent généralement d'organisations individuelles, les spécifications qu'il met en œuvre (telles que les bibliothèques d'analyse statistique) peuvent être définies par d'autres organisations. Les programmes utilisant des packages peuvent avoir besoin de connaître la version de la spécification implémentée par le package, de sorte que les fonctions définies uniquement dans une certaine version peuvent être utilisées. De même, ces programmes peuvent également avoir besoin de savoir quelle version d'implémentation lui est fournie, principalement pour faire face aux défauts possibles dans différentes versions. Certaines des principales méthodes de la classe de packages permettent d'accéder à ces informations:
Par exemple, si vous extraire ces informations du package java.lang de notre système, vous obtiendrez les résultats suivants: '
Titre de la spécification: API de la plate-forme Java Spécification Spécification Version: 1.4 Spécification Vendeur: Sun Microsystems, Inc. Titre de l'implémentation: Java Runtime Environment Implementation Version: 1.5.0_02 Implémentation Vendeur: Sun Microsystems, Inc.
Le numéro de version canonique se compose de nombres non négatifs séparés par des délimiteurs d'époque, tels que '' 2.0 '' ou '11 .0.12 '. Ce modèle nous permet d'appeler la méthode ISCompatible avec comparer le numéro de version qui suit ce modèle avec le numéro de version du package. Si le numéro de version du package est supérieur ou égal au numéro de version du successeur, la méthode renvoie true. Cette comparaison compare uniquement un numéro séparé par période à la fois. Si l'un de ces nombres est plus petit que la position correspondante dans le numéro de version passée, les deux versions sont incompatibles. Si l'un des numéros de version est plus long que l'autre, la partie manquante des numéros de version courte sera considérée comme zéro. Par exemple, si le numéro de version canonique du package est "1.4" et que nous le comparons avec "1.2", "1.3.1 '. Ou" .1.81., Alors True sera retourné; Mais par rapport à "1.4.2 '. ou" .5 ", alors False sera retourné. Cette conclusion est tirée car ce mécanisme de comparaison suppose que la version de spécification est compatible en arrière.
Il n'y a pas de format spécifié pour le numéro de version d'implémentation, car différentes organisations qui fournissent l'implémentation définiront différemment la version d'implémentation. La seule comparaison qui peut être faite entre les versions d'implémentation est de tester si la version est la même, où il n'y a pas d'hypothèse de compatibilité arriérée.
Le package peut être scellé, ce qui signifie que les classes ne peuvent plus être ajoutées au package. Les packages non scellés peuvent contenir des classes à partir de plusieurs emplacements différents dans le chemin de recherche de classe, tandis que le contenu du package scellé doit provenir du même emplacement - soit une archive spécifique, soit un emplacement spécifié par une URL. Il existe deux façons de déterminer si un paquet est scellé:
.Public Boolean Issesaled P: Retour Trueo si le colis est scellé
.Public Boolean ISSaled (URL URL): Retour True Si le package est scellé pour l'URL donnée, c'est-à-dire que les classes du package peuvent être chargées à partir de cette URL donnée. Si la classe du package ne peut pas être chargée à partir de l'URL donnée ou si le package n'est pas scellé, alors FALSE est renvoyé et que les informations de spécification et d'implémentation du package sont généralement fournies dans le cadre du fichier manifeste stocké avec le package - par exemple dans le cadre du fichier manifeste dans une archive Java (JAR), comme décrit dans la section 25.9.2, «Archive File Java.util.jar». Lorsqu'une classe dans un package est chargée, ces informations sont lues par la personne. Un Classloader peut définir dynamiquement un objet de package pour la classe qu'il souhaite charger:
Nous pouvons appeler la méthode GetPackage de l'objet de classe de la classe donnée pour obtenir l'objet de package de cette classe. Nous pouvons également appeler le package statique.getPackage avec le nom de package donné pour obtenir l'objet de package, ou appeler le package statique.GetPackages, qui renverra le tableau de package composé de tous les packages actuellement connus dans le chargeur de classe. Les deux méthodes sont liées au chargeur de classe qui appelle leur code, car ces codes appellent les méthodes Get-Package ou GetPackages de leur chargeur de classe. Les méthodes de ces chargeurs de classe rechercheront un chargeur de classe spécifique et tous ses chargeurs de classe parent, et si aucun paramètre n'est fait pour le chargeur de classe actuel, le chargeur de classe système sera utilisé pour le moment. Notez que si le package est inconnu, la méthode Classloader retournera NULL car aucun type dans le package n'a été chargé pour le moment.