Laboratorio de Programación  >  Material de estudio  >  Apuntes  >  Paquetes

Paquetes (packages)

José A. Mañas <jmanas@dit.upm.es>
Dept. de Ingeniería de Sistemas Telemáticos
Universidad Politécnica de Madrid
31 de enero, 2007

Introducción

Las clases en Java se agrupan por familias que se denominan paquetes (packages).

Todas las clases pertenecen a un paquete. Por ejemplo, la clase String pertenece al paquete java.lang y se dice que el nombre completo de String es

  java.lang.String

A la hora de referirnos a una clase, por ejemplo para crear un objeto de dicha clase, podemos poner el nombre completo

  java.lang.String nombreAlumno= "Jorge García";
lo que puede ser tedioso y, para aliviar la redacción, Java permite referirnos directamente a las clases del paquete java.lang:
  String nombreAlumno= "Jorge García";

Otros paquetes lo tienen un poco más difícil. Así, la interface List<E> y la clase ArrayList<E> del paquete java.util requeriría la notación completa:

  java.util.List<String> notas= new java.util.ArrayList<String>();

Demasiado texto, ¿verdad?

Java permite referirnos a los miembros de un paquete por el sombre sencillo de su clase si previamente lo hemos importado:

  import java.util.List;
  import java.util.ArrayList;
  ...
  List<String> notas= new ArrayList<String>();

La importación puede ser clase a clase como en el ejemplo anterior, o podemos importar todas clases del paquete al tiempo:

  import java.util.*;
  ...
  List<String> notas= new ArrayList<String>();

Si existieran clases con el mismo nombre en diferentes paquetes, el sistema se quejaría de la ambigüedad, requiriendo el nombre completo del paquete. Nótese que al final no podemos tener dos clases con igual nombre en el mismo paquete.

¿A qué paquete pertenecen nuestras clases?

Lo más sencillo es indicarlo explícitamente:
  package paquete.maravilloso;
  ...
  class xxx { ... }
que crea la clase paquete.maravilloso.xxx.

Si no escribimos package, java asigna la clase a un paquete anónimo por defecto. Para pequeños experimentos, basta; pero para convivir con otros programadores es muy recomendable asignar las clases siempre a algún paquete.

Utilidad de los paquetes

La primera y más evidente ventaja del uso de paquetes es que las clases quedan ordenadas y no hay colisión de nombres. Si dos programadores llaman igual a sus clases y luego hay que juntar el código de ambos, basta explicitar a qué paquete nos referimos en cada caso.

En las prácticas del laboratorio usamos los paquetes para discernir una práctica de otra:

  package lprg.p1;	// para la primera práctica, por ejemplo

Ámbitos de visibilidad

Los paquetes también establecen un perímetro de visibilidad para las clases y los miembros (variables y métodos) de las clases cuando no se dice explícitamente si son públic (para cualquiera, en este o en otro paquete) o private (exclusivamente para esta clase).

Así, la clase C, la variable v y el método m de la siguiente clase

  package lprg.p1;

  class C {
    String v= "...";

    void m (...) { ... }
  }
serán accesibles para todas las clases del paquete lprg.p1; pero inaccesibles por clases de otros paquetes.

El resultado es una forma muy cómoda de restringir el ámbito a "la familia".