Contenido de paquete
El contenido del paquete debe diseñarse cuidadosamente para que solo incluyan clases e interfaces funcionalmente relevantes. Las clases en el paquete pueden acceder libremente a los miembros no privados de otras clases en el paquete, y algunas clases pueden incluso tener permisos suficientes para acceder a los detalles internos de otras clases. Para evitar tales clases de los miembros de la clase gestros, necesitamos proteger a los miembros de la clase. Cualquier miembro no declarado como privado puede ser accedido por todos los demás tipos en el mismo paquete, por lo que cualquiera de las clases no relacionadas puede ser más coordinada de lo que esperamos.
Los paquetes también proporcionan agrupación lógica para programadores que buscan interfaces y clases útiles. Los paquetes compuestos por clases irrelevantes dificultan que los programadores dan cuenta qué interfaces y clases son útiles, y la agrupación lógica de las clases puede ayudar a los programadores a reutilizar el código porque los programadores pueden encontrar lo que necesitan más fácilmente a través de la agrupación lógica. Si el paquete solo contiene conjuntos de tipos estrictamente acoplados relacionados, significa que podemos darle al tipo algunos nombres más intuitivos para evitar conflictos de nombres.
Los paquetes pueden estar anidados. Por ejemplo, Java.lang es un paquete anidado donde el paquete Lang está anidado en el paquete más grande Java, mientras que el paquete J AVA también contiene algunos otros paquetes. La anidación hace que los paquetes relacionados formen un sistema de nombres con estructura jerárquica.
Por ejemplo, para crear un conjunto de paquetes para sistemas adaptativos como redes neuronales y algoritmos genéticos, podemos nombrar paquetes con nombres separados por puntos para crear paquetes anidados:
paquete adaptativo. red neuronal;
El archivo fuente que contiene la declaración de declaración anterior se encuentra en el paquete Adaptive.neuralnet, y el paquete Adaptive.neuralnet en sí es un subpackage del paquete adaptativo. El paquete adaptativo puede contener algunas clases relacionadas con algoritmos adaptativos generales, como clases de declaración de problemas de generalización o clases de referencia. Los paquetes que están en una posición más profunda en la jerarquía (por ejemplo, adaptativa.neu-ralnet o adaptive.genetic) contienen clases relacionadas con un tipo específico de algoritmo adaptativo.
La anidación de los paquetes es solo una herramienta para organizar paquetes relacionados, y no proporciona ningún derecho de acceso especial entre paquetes.
El código de clase en el paquete Adaptive.Genetic no puede acceder a los miembros en el paquete adaptativo o adaptativo.neuralnet que tiene derechos de acceso al paquete, y el alcance del paquete solo se aplica a paquetes específicos. La anidación de los paquetes puede agrupar paquetes relevantes y ayudar a los programadores a encontrar la clase deseada en el nivel lógico de manera más conveniente, pero más allá de eso, no trae ningún otro beneficio.
Notas de paquete
El paquete también puede tener anotaciones. Pero el problema es que, dado que los paquetes son una estructura organizacional y no tienen entidades de código fuente y no tienen una definición real, no pueden ser anotados como clases o métodos. Por lo tanto, la anotación del paquete solo se puede lograr anotando la declaración de declaración del paquete en el archivo fuente. Sin embargo, solo puede haber una declaración de paquete en cada paquete que puede tener anotaciones que actúan en consecuencia.
Entonces, ¿cómo se anotan los paquetes? De hecho, Java no obliga a los programadores a usar alguna forma de lidiar con la regla de "Declaración de paquete anotado único". La forma recomendada es crear un archivo llamado paquete-i nfo.java en el directorio de paquetes, en el que solo las declaraciones del paquete y las anotaciones del paquete se almacenan sin colocar nada más. Por ejemplo, el archivo del paquete Info.java para el paquete ATTT se ve así:
@PackagesPec (nombre dos "Proyecto ATTR", versión = "1.0" @develoveltmentsite ("attr.project.org") @develovelopmentModel ("abre-sale") paquete attr;PACKAGSPEC, Desarrollo y OpmentModel de desarrollo se utilizan para modificar los tipos de anotación. Por supuesto, tienen estrategias de ahorro de tiempo de ejecución. paquete-Info.java El archivo debe compilarse con otros archivos de origen en el paquete.
Recomendamos colocar toda la información relacionada con el paquete en el archivo Package-Info.java. Si hace esto, puede colocar comentarios de documentos al comienzo del archivo, para que estos documentos se anoten como documentos de paquete.
Paquete de objetos y especificaciones
Los paquetes generalmente implementan algunas especificaciones, y generalmente son de una organización. Los objetos de paquete son diferentes de otros tipos de reflexión y no se pueden usar para crear u operar paquetes, pero solo pueden servir como una base de conocimiento para proporcionar información, que proporciona información sobre las especificaciones implementadas por el paquete (el título, el proveedor y el número de versión de la especificación) e información sobre la implementación del paquete en sí (el título, el proveedor y el número de versión del paquete). Aunque los paquetes generalmente provienen de organizaciones individuales, las especificaciones que implementa (como las bibliotecas de análisis estadístico) pueden ser definidas por otras organizaciones. Los programas que usan paquetes pueden necesitar conocer la versión de la especificación implementada por el paquete, de modo que las funciones definidas solo en una determinada versión se puedan utilizar. Del mismo modo, estos programas también pueden necesitar saber qué versión de implementación se le proporciona, principalmente para tratar posibles defectos en diferentes versiones. Algunos de los principales métodos de la clase de paquete permiten el acceso a esta información:
Por ejemplo, si extrae esta información del paquete java.lang en nuestro sistema, obtendrá los siguientes resultados: '
Título de la especificación: Java Platform API Especificación de especificación Versión: 1.4 Vendor de especificaciones: Sun Microsystems, Inc. Título de implementación: Java Runtime Entorno Implementación Versión: 1.5.0_02 Proveedor de implementación: Sun Microsystems, Inc.
El número de versión canónica consiste en números no negativos separados por delimitadores de época, como "2.0" o '11 .0.12 '. Este patrón nos permite llamar al método ISCompatibleWith para comparar el número de versión que sigue este patrón con el número de versión del paquete. Si el número de versión del paquete es mayor o igual al número de versión del sucesor, entonces el método devuelve verdadero. Esta comparación solo compara un número separado por el período a la vez. Si alguno de estos números es más pequeño que la posición correspondiente en el número de versión pasada, entonces las dos versiones son incompatibles. Si uno de los números de versión es más largo que el otro, la parte faltante en los números de versión corta se considerará cero. Por ejemplo, si el número de versión canónica del paquete es "1.4" y lo comparamos con "1.2", "1.3.1 '. O" .1.81., Entonces verdadero se devolverá; pero si se compara con "1.4.2 '. o" .5 ", entonces se devolverá False. Esta conclusión se extrae porque este mecanismo de comparación supone que la versión de especificación es compatible con retroceso.
No hay formato especificado para el número de versión de implementación, porque diferentes organizaciones que proporcionan la implementación definirán la versión de implementación de manera diferente. La única comparación que se puede hacer entre las versiones de implementación es probar si la versión es la misma, donde no hay una suposición de compatibilidad con atraso.
El paquete se puede sellar, lo que significa que las clases ya no se pueden agregar al paquete. Los paquetes no sellados pueden contener clases de múltiples ubicaciones diferentes en la ruta de búsqueda de clases, mientras que el contenido del paquete sellado debe provenir de la misma ubicación, ya sea un archivo específico o una ubicación especificada por una URL. Hay dos formas de determinar si un paquete está sellado:
.Public boolean issealed p: return trueO si el paquete está sellado
.Public boolean issealed (URL URL): devuelva verdadero si el paquete está sellado para la URL dada, es decir, las clases en el paquete se pueden cargar a partir de esta URL dada. Si la clase en el paquete no se puede cargar desde la URL dada, o el paquete no está sellado, entonces se devuelve False, y la información de especificación e implementación del paquete generalmente se proporciona como parte del archivo manifiesto almacenado con el paquete, por ejemplo, como parte del archivo manifiesto en un Archivo Java (JAR), como se describe en la Sección 25.9.2, "Archivo Java.util.Jar". Cuando se carga una clase en un paquete, la persona lee esta información. Un cargador de clases puede definir dinámicamente un objeto de paquete para la clase que desea cargar:
Podemos llamar al método GetPackage del objeto de clase de la clase dada para obtener el objeto de paquete de esta clase. También podemos llamar al paquete estático. GetPackage con el nombre del paquete dado para obtener el objeto del paquete, o llamar al paquete estático.getPackages, que devolverá la matriz de paquetes compuesta por todos los paquetes que se conocen actualmente en el cargador de clase. Ambos métodos están relacionados con el cargador de clases que llama a su código, porque estos códigos llamarán a los métodos Get-Package o GetPackages de su cargador de clase. Los métodos de estos cargadores de clase buscarán un cargador de clase específico y todos sus cargadores de clase padre, y si no se realizan configuraciones para el cargador de clase actual, el cargador de clase del sistema se utilizará en este momento. Tenga en cuenta que si se desconoce el paquete, el método de carnero de clases devolverá nulo porque no se ha cargado ningún tipo en el paquete en este momento.