Paquetes en Java - package e import

Las convenciones del lenguaje Java recomiendan el uso de paquetes (packages) para la agrupación y organización de las clases, interfaces y anotaciones. Estas divisiones se conocen como espacios de nombres (namespaces).

Elección de nombres para paquetes java

La idea es crear paquetes con nombres únicos, para evitar colisiones de nombres. Para esto, es recomendado el uso de dominios de internet como “edu4java.com”, en forma invertida “com.edu4java”, como prefijo de paquetes.

Por ejemplo, para un juego llamado killthemall, los nombres de los paquetes podrían ser:

com.edu4java.killthemall.game
com.edu4java.killthemall.ui
com.edu4java.killthemall.worldlogic  

Convención para nombres de paquetes java

No hay una clara definición oficial, pero sí una convención de facto:

Palabra clave “package”

La mayoría de los archivos de código fuente java, comienzan con la palabra clave; package. Al agregar un paquete a nuestra clase HelloWorld, queda así:

package com.edu4java.javatutorials;

import javax.swing.JOptionPane;

public class HelloWorld {
	public static void main(String[] args) {
		JOptionPane.showMessageDialog(null, "Hello World");
	}
}  

De ahora en adelante, el nombre completo de nuestra clase es:

com.edu4java.javatutorials.HelloWorld   

Y puede ser llamada así, desde cualquier otra clase de otro paquete. Ejemplo:

package com.edu4java.javatutorials.otherpackage;

public class CallHelloWorld {
	public static void main(String[] args) {
		com.edu4java.javatutorials.HelloWorld.main(null);
	}
}

Palabra clave “Import”

Una opción muy conveniente cuando usamos una clase o interfaz de otro paquete, es el uso de la palabra clave import. Si usamos import, no es necesario escribir el nombre completo de la clase con el paquete incluido. Es suficiente con el nombre de la clase.


import com.edu4java.javatutorials.HelloWorld;

public class CallHelloWorld {
	public static void main(String[] args) {
		HelloWorld.main(null);
	}
}

Es interesante saber, que las clases del paquete java.lang, son importadas automáticamente. Por ejemplo, si usamos la clase String, no es necesario importarla. Podemos ver en el ejemplo, como usamos java.lang.String, para declarar s1, y tan sólo String para declarar s2 y ambos funcionan.

package com.edu4java.javatutorials.otherpackage;

import com.edu4java.javatutorials.HelloWorld;

public class CallHelloWorld {
	java.lang.String s1;
	String s2;
	public static void main(String[] args) {
		HelloWorld.main(null);
	}
}

Por cada palabra entre puntos; un subdirectorio

Aunque veamos en el explorador de paquetes de eclipse algo como;

Explorador de paquetes

donde pareciera que existe un directorio “com.edu4java.javatutorials”, en donde se encuentra el archivo “HelloWorld.java”, la realidad es que “HelloWorld.java” está en:

C:\eclipse\workspace\hello-world\src\com\edu4java\javatutorials\HelloWorld.java

Los paquetes afectan la visibilidad de métodos, campos, etc.

Los métodos y campos de una clase, son accesibles desde otra clase del mismo paquete, salvo que sean declarados usando el modificador private. Veremos más sobre los modificadores de nivel de acceso, (public, private y protected) en un próximo tutorial.