Imprimir
Categoría: Java
Visto: 4325

En PC Resumen hablaremos del concepto de paquetes en el lenguaje de programación en Java. En los ejemplos anteriores, el nombre de cada clase se tomaba del mismo espacio de nombres. Esto quiere decir que para evitar colisiones cada clase tenía que tener su propio nombre. Al cabo de un tiempo, si el espacio de nombres no se ha gestionado de forma adecuada, puede pasar que se agoten los nombres más convenientes y representativos para cada clase. También hay que asegurarse que el nombre elegido no colisione con los nombres elegido por otros programadores. Java proporciona un mecanismo para dividir el espacio de nombres de clase en partes más manejables.

Este mecanismo es el paquete. El paquete es tanto un mecanismo para nombrar como para controlar los nombres asignados. En un paquete se pueden definir clases que no sean accesibles desde un código externo; también se pueden definir miembros de clase a los que únicamente puedan acceder miembros del mismo paquete. Esto permite que las clases de un paquete tengan un conocimiento mutuo que no tiene el resto.

Definición de un paquete

Crear un paquete es muy sencillo, simplemente debemos incluir el mando package como la primera sentencia en un archivo fuente Java. Cualquier clases que se declare dentro de este archivo pertenecerá al paquete especificado. La sentencia package define un espacio de nombres dentro del cual se almacenan clases. Si no se pone, los nombres de clase se colocan en el paquete por defecto que no tiene nombre.

La siguiente sentencia, por ejemplo, crea el paquete llamado miPaquete.

package miPaquete;

Se puede crear una jerarquía de paquetes, para hacerlo sólo hay que separar por un punto el nombre de cada paquete del inmediatamente superior.

La jerarquía de niveles debe reflejarse en el sistema de archivos del sistema. Por ejemplo un paquete declarado como package java.sql.Date debe almacenarse en java/sql/Date. Hay que tener presente que si cambiamos el nombre del paquete estamos cambiando el nombre del directorio donde están las clases.

Los paquetes y el CLASSPATH

¿Cómo sabe el intérprete de Java donde debe buscar los paquetes que se van creando? En primer lugar la interpreta utiliza por defecto el directorio de trabajo como punto de partida, por lo tanto lo encontrará si el paquete está en este directorio o en un subdirectorio. En segundo lugar, se puede especificar una ruta de directorio, ajustando la variable de entorno CLASSPATH.

Protección de acceso

Dada la interacción entre clases y paquetes, Java establece cuatro categorías de visibilidad para los miembros de clase:

Los especificadores de acceso: private, public, protected proporcionan una gran variedad de formas para producir los diferentes niveles de acceso que necesitan. La siguiente tabla resume las interacciones:

- Privado Sin modificar Protegido Público
Misma Clase SI SI SI SI
Subclase del mismo paquete NO SI SI SI
No subclase del mismo paquete NO SI SI SI
Subclase de un paquete diferente NO NO SI SI
No subclase de un paquete diferente NO NO NO SI

 

Aunque parezca muy complicado, se puede simplificar como se explica a continuación. Se puede acceder a cualquier elemento declarado público desde cualquier parte del programa. Y no se puede acceder a un elemento declarado private desde fuera de su clase. Cuando a un miembro le falta una especificación explícita de acceso, resulta visible para las subclases y para otras clases del mismo paquete. Este es el acceso por defecto. Si se quiere que un elemento sea visible desde fuera de su paquete, pero sólo para las clases derivadas directamente de la clase a la que pertenece, se declarará protected.

Esto sólo se aplica para los miembros de las clases. una clase tiene solamente dos nivel posibles de acceso: por defecto y público. Si es pública es accesible a cualquier parte del código. Si tiene acceso por defecto, sólo se puede acceder a ella por medio de un código que se encuentre en el mismo paquete.

Importación de paquetes

Todas las clases estándar están almacenadas en paquetes con nombre. Dado que las clases contenidas en un paquete se calificarán con el nombre del paquete, puede resultar muy pesado tener que escribir el nombre completo para cada clase. Por ello, Java incluye la sentencia import que permite hacer visibles ciertas clases o paquetes enteros. Una vez se ha importado una clase, se puede hacer referencia a ella utilizando sólo el nombre.

La sentencia import se puede usar de dos formas diferentes como se ve en el ejemplo siguiente:

import java.sql.Date
import java.io. *

Con la opción del asterisco estamos importante todo el paquete entero. Esta opción puede incrementar el tiempo de compilación si se trata de paquetes grandes, pero no tiene ningún efecto sobre el tiempo de ejecución o el tamaño de las clases.

Las clases que constituyen el lenguaje básico de Java se almacenan en un paquete llamado java.lang. Como prácticamente cualquier programa hace uso de estas clases, este paquete es importado automáticamente por el compilador.

Si una clase existe con el mismo nombre en dos paquetes diferentes y les importamos los dos, a la hora de utilizar esta clase tendremos que poner el nombre completo para que el compilador no dé error.

Por ejemplo si tenemos:

import java.util.Date
import java.sql.Date

A la hora de utilizar una variable de tipo Date deberemos especificar cuál. Por ejemplo:

java.util.Date Data = new java.util.Date();