Paquetes

Paquetes

A medida que se incorporan clases de terceros aumenta la posibilidad de encontrarse clases con el mismo nombre

Las posibilidades son aún mayores en Java, donde las clases de millones de programadores viajan a través de la red

La solución que aporta Java son los paquetes (packages)

Para especificar la clase deseada basta con indicar el nombre del paquete al que pertenece

Sun dió en su día unas recomendaciones para que los nombres de los paquetes fueran únicos:

  • Si se va a utilizar dentro de la empresa podrán usar cualquier convenio interno

  • Si se va a utilizar fuera de la empresa deberá usarse como prefijo el dominio de Internet de la compañía invertido (esto asegura que sea único), por ejemplo com.sun.graphics3D

  • Las clases estándar tienen reservado los prefijos java y javax

Toda clase debe pertenecer a algún paquete

Las clases Java se reparten en varios paquetes básicos:

Package
java javax
java.applet javax.accessibility
java.awt javax.activation
java.beans javax.activity
java.io javax.annotation
java.lang javax.crypto
java.math javax.imageio
java.net javax.jws
java.nio javax.lang
java.rmi javax.management
java.security javax.naming
java.sql javax.net
java.text javax.print
java.util javax.rmi
javax.script
javax.security
javax.smartcardio
javax.sound
javax.sql
javax.swing
javax.tools
javax.transaction
javax.xml

El nombre de una clase incluye un prefijo el paquete al que pertenece

En el ejemplo, la clase Vector se encuentra dentro del paquete java.util

En el ejemplo se ha utilizado la palabra reservada import que permite indicar el paquete al que pertenece una o más clases, de tal manera que no haya que repetirlo con cada uso de las mismas

import no produce la carga de ningún tipo de fichero (no equivale al #include de C / C++)

El paquete java.lang es importado automáticamente

Colisión de nombres

En el caso de que se repita el nombre de una clase en dos paquetes importados habría que utilizar el nombre completo de la clase para deshacer la ambigüedad

En el ejemplo se ha especificado el paquete del que se desea coger la clase Vector, con el símbolo asterisco le estamos diciendo que tome todo el paquete

En el ejemplo se ha usado un import de la clase concreta Vector y otro de todo el paquete

Hay que tener en cuenta que el import de la clase tendrá prioridad sobre el import de todo un paquete

Por lo que podría eliminarse si no queremos usar el resto de las clases de ese paquete, al ser redundante

Creación de paquetes

Para indicar que una clase pertenece a un paquete hay que usar la cláusula package

En el ejemplo se ha creado el paquete ejemplos que contiene sólo la clase Ejemplo1

Si hemos de utilizar en otra clase, el nombre del paquete podrá estar formado por varias palabras separadas por punto

En este caso el nombre de la clase será ejemplos.Ejemplo1

Si quisiéramos ejecutarla para usarla en otras clases desde línea de comandos:

Classpath

Java no tiene el concepto de fichero ejecutable (fichero con extensión .EXE o .COM)

Cada clase genera un fichero class independiente

Para ejecutar un programa hay que indicar el nombre de una clase que contenga al menos una función main

El resto de clases se irán cargando dinámicamente bajo demanda

Puede haber varias clases con main pero sólo puede haber un main que sea el principal

En el caso de aplicaciones locales se localizará el código de las clases:

  • La JVM añade al nombre de la clase la extensión class para formar el nombre del fichero

  • Para localizar dicho fichero se utiliza la variable de entorno CLASSPATH

  • CLASSPATH indica una serie de localizaciones en las cuales buscar las clases que pueden ser:

    • Un directorio
    • Un fichero ZIP o JAR (Java Archive Resource)

En el ejemplo se ha usado la línea de comandos de Windows para definir el CLASSPATH

La clase Prueba buscaría (en este orden) en:

  1. c:\ejemplos\Prueba.class
  2. dentro del fichero
  3. c:\java\lib\classes.zip y en ningún lugar más

Cuando se utilizan clases hechas por terceros es necesario incluir su directorio (o ZIP, JAR) en el CLASSPATH para que la JVM se capaz de encontrarlas

Paquetes y Classpath

En el JDK hay relación entre el paquete de una clase y el directorio en el que se encuentra

Todas las clases de un paquete deberán estar en un directorio con el mismo nombre

Si el nombre de un paquete tiene varias palabras cada palabra se corresponde con el nombre de un subdirectorio

Por ejemplo, las clases del paquete ur.mis.ejemplos estarían en el directorio ur/mis/ejemplos

Este directorio deberá ser accesible a partir de alguna de las localizaciones del CLASSPATH

El mecanismo de la JVM del JDK para localizar la implementación de una clase en tiempo de ejecución es:

  1. añade .class al nombre completo de la clase
  2. transforma los puntos en separadores de directorio \
  3. añade la cadena resultante a cada una de las localizaciones del CLASSPATH
  4. si no se encuentra en ninguna de ellas se produce un error de ejecución

Sigamos el proceso con un ejemplo en el que queremos cargar en el JDK la clase UR.ejemplos.ejemplo1:

  1. Definimos el CLASSPATH como:

  2. La JVM busca la clase en el fichero UR\ejemplos\ejemplo1.class

  3. El fichero será buscado en las localizaciones del CLASSPATH c:\programas\UR\ejemplos\ejemplo1.class y c:\temp\UR\ejemplos\ejemplo1.class

  4. Si la clase no se encuentra en ninguno de estos dos sitios, se producirá un error de ejecución