Los paquetes son el mecanismo por el que Java permite agrupar clases, interfaces, excepciones y constantes. De esta forma, se agrupan conjuntos de estructuras de datos y de clases con algún tipo de relación en común.
Con la idea de mantener la reutilización y facilidad de uso de los paquetes desarrollados es conveniente que las clases e interfaces contenidas en los mismos tengan cierta relación funcional. De esta manera los desarrolladores ya tendrán una idea de lo que están buscando y fácilmente sabrán qué pueden encontrar dentro de un paquete.
B. Creación de un paquete a.) DeclaraciónPara declarar un paquete se utiliza la sentencia package seguida del nombre del paquete que estemos creando:
package NombrePaquete;La estructura que ha de seguir un fichero fuente en Java es:
Por lo tanto la sentencia de declaración de paquete ha de ser la primera en un archivo fuente Java.
b.) NomenclaturaPara que los nombres de paquete puedan ser fácilmente reutilizados en toda una compañía o incluso en todo el mundo es conveniente darles nombres únicos. Esto puede ser una tarea realmente tediosa dentro de una gran empresa, y absolutamente imposible dentro de la comunidad de Internet.
Por eso se propone asignar como paquetes y subpaquetes el nombre de dominio dentro de Internet. Se verá un ejemplo para un dominio que se llamase japon.magic.com, un nombre apropiado sería com.magic.japon.paquete.
c.) SubpaquetesCada paquete puede tener a su vez paquetes con contenidos parecidos, de forma que un programador probablemente estará interesado en organizar sus paquetes de forma jerárquica. Para eso se definen los subpaquetes.
Para crear un subpaquete bastará con almacenar el paquete hijo en un directorio Paquete/Subpaquete.
Así una clase dentro de un subpaquete como Paquete.Subpaquete.clase estará codificada en el fichero Paquete/Subpaquete.java.
El JDK define una variable de entorno denominada CLASSPATH que gestiona las rutas en las que el JDK busca los subpaquetes. El directorio actual suele estar siempre incluido en la variable de entorno CLASSPATH.
Para más información sobre el JDK véase el "Apéndice I. JDK" de este tutorial.
C. Uso de un paqueteCon el fin de importar paquetes ya desarrollados se utiliza la sentencia import seguida del nombre de paquete o paquetes a importar.
Se pueden importar todos los elementos de un paquete o sólo algunos.
Para importar todas las clases e interfaces de un paquete se utiliza el metacaracter *:
import PaquetePrueba.*;También existe la posibilidad de que se deseen importar sólo algunas de las clases de un cierto paquete o subpaquete:
import Paquete.Subpaquete1.Subpaquete2.Clase1;Para acceder a los elementos de un paquete, no es necesario importar explícitamente el paquete en que aparecen, sino que basta con referenciar el elemento tras una especificación completa de la ruta de paquetes y subpaquetes en que se encuentra.
Paquete.Subpaquetes1.Subpaquete2.Clase_o_Interfaz.elementoEn la API de Java se incluyen un conjunto de paquetes ya desarrollados que se pueden incluir en cualquier aplicación (o applet) Java que se desarrolle. Estos paquetes son explicados con más detalle en el capítulo "III.1.Bibliotecas de la API de Java" de este tutorial.
D. Ámbito de los elementos de un paqueteAl introducir el concepto de paquete, surge la duda de cómo proteger los elementos de una clase, qué visibilidad presentan respecto al resto de elementos del paquete, respecto a los de otros paquetes...
Ya en la herencia se vieron los identificadores de visibilidad public (visible a todas las clases), private (no visible más que para la propia clase), y protected (visible a clases hijas).
Por defecto se considera los elementos (clases, variables y métodos) de un mismo paquete como visibles entre ellos (supliendo las denominadas clases amigas de C++).
Situación del elemento |
private |
sin modificador |
protected |
public |
En la misma clase |
Sí |
Sí |
Sí |
Sí |
En una clase en el mismo paquete |
No |
Sí |
Sí |
Sí |
En una clase hija en otro paquete |
No |
No |
Sí |
Sí |
En una clase no hija en otro paquete |
No |
No |
No |
Sí |
Tabla 19: Visibilidad dentro de un paquete
Todas las reglas explicadas en este apartado son igualmente válidas para las interfaces Java.
Para más información véase [Naughton, 1996].