Packages y módulos
Packages
Los packages organizan clases relacionadas y evitan conflictos de nombres.
Declarar un package
package com.empresa.proyecto.modelo;
public class Usuario { // clase Usuario en el package especificado}Estructura de directorios
src/main/java/└── com/ └── empresa/ └── proyecto/ └── modelo/ └── Usuario.javaEl package com.empresa.proyecto.modelo corresponde al directorio com/empresa/proyecto/modelo/.
Import
Import específico
import java.util.List;import java.util.ArrayList;
public class Ejemplo { List<String> lista = new ArrayList<>();}Import con wildcard
import java.util.*; // Importa todas las clases de java.util
public class Ejemplo { List<String> lista = new ArrayList<>(); Map<String, Integer> mapa = new HashMap<>();}Nota: El wildcard no importa subpackages. java.util.* no importa java.util.stream.*.
Import static
Para importar miembros estáticos:
import static java.lang.Math.PI;import static java.lang.Math.pow;
public class Circulo { public double area(double radio) { return PI * pow(radio, 2); // Sin Math.PI y Math.pow }}Packages estándar
java.lang
Se importa automáticamente. Contiene:
String,Object,SystemInteger,Double,Boolean(wrappers)MathThread- Excepciones básicas
// No necesita importString texto = "Hola";System.out.println(texto);java.util
Colecciones y utilidades:
import java.util.List;import java.util.ArrayList;import java.util.Map;import java.util.HashMap;java.io
Entrada/salida:
import java.io.File;import java.io.FileReader;import java.io.BufferedReader;java.nio
I/O moderno (New I/O):
import java.nio.file.Path;import java.nio.file.Files;Java Module System (JPMS)
Introducido en Java 9 para organizar aplicaciones grandes.
¿Qué es un módulo?
Un módulo es un grupo de packages relacionados con dependencias explícitas.
module-info.java
Define un módulo:
module com.empresa.proyecto { // Exporta packages (visibles para otros módulos) exports com.empresa.proyecto.api; exports com.empresa.proyecto.modelo;
// Requiere otros módulos requires java.sql; requires java.logging;
// Requiere módulos transitivos requires transitive java.desktop;
// Abre packages para reflexión (frameworks) opens com.empresa.proyecto.modelo to com.fasterxml.jackson.databind;}Estructura con módulos
mi-proyecto/├── src/│ ├── module-info.java│ └── com/empresa/proyecto/│ ├── Main.java│ ├── api/│ └── modelo/└── pom.xmlVisibilidad con módulos
Sin módulos (classpath)
public: visible para todoprotected: package + subclases- default: solo el package
private: solo la clase
Con módulos (module path)
Un package solo es visible si está exportado en module-info.java:
module com.empresa.proyecto { exports com.empresa.proyecto.api; // ✅ Visible // com.empresa.proyecto.interno NO exportado ❌ No visible fuera del módulo}Módulos estándar
Java SE se divide en módulos:
java.base: Módulo base (se incluye automáticamente)java.sql: JDBCjava.xml: XMLjava.logging: Loggingjava.desktop: AWT, Swing
Ver todos los módulos:
java --list-modulesUnnamed Module
Código sin module-info.java se ejecuta en el "unnamed module". Puede leer todos los módulos pero no puede ser leído por módulos nombrados.
Multi-module projects
Proyecto dividido en múltiples módulos:
mi-aplicacion/├── core/│ ├── src/│ │ ├── module-info.java│ │ └── com/empresa/core/│ └── pom.xml├── api/│ ├── src/│ │ ├── module-info.java│ │ └── com/empresa/api/│ └── pom.xml└── web/ ├── src/ │ ├── module-info.java │ └── com/empresa/web/ └── pom.xmlapi/module-info.java:
module com.empresa.api { requires com.empresa.core; // Depende del módulo core exports com.empresa.api;}Buenas prácticas
-
Usa packages significativos:
com.empresa.proyecto.usuario, nocom.empresa.proyecto.package1. -
Evita dependencias cíclicas entre packages.
-
No uses el package por defecto (sin declaración de package).
-
Imports específicos sobre wildcards (más claro).
-
Módulos solo para proyectos grandes: Proyectos pequeños no los necesitan.
Próximo paso
Aprende sobre la estructura de directorios de un proyecto Java: Estructura de directorios →