Colisiones de nombres en un espacio global
Un namespace es un contenedor lógico que agrupa clases e interfaces para darles un contexto único y evitar colisiones de nombres. Sin namespaces, dos clases Usuario o dos clases Date compiten por el mismo nombre simple en un único espacio global plano.
Colisión: el compilador no sabe qué clase Usuario (o Date) estás pidiendo.
La carpeta tiene que coincidir con el package
A diferencia de otros lenguajes, Java impone una correspondencia estricta: el namespace declarado en package debe coincidir exactamente con la ruta de carpetas en el classpath. Elegí un archivo del árbol para ver su declaración obligatoria.
- com
- facundouferer
- tienda
- dominio
- servicio
- tienda
- facundouferer
package com.facundouferer.tienda.dominio; FQCN: com.facundouferer.tienda.dominio.Producto El FQCN se arma pieza por pieza
Para la JVM, Producto es solo una etiqueta local. Su identidad formal ante el ClassLoader es el Fully Qualified Class Name (FQCN): dominio invertido, proyecto, capa y clase, unidos por puntos.
Tocá "Agregar siguiente pieza" para empezar a construir el FQCN.
com.facundouferer.tienda.dominio.Producto entidad de dominio propia com.proveedor.catalogo.Producto DTO importado de un catálogo externo import no carga código: registra un alias
La sentencia import es un atajo léxico para no escribir el FQCN cada vez. Java prohíbe importar dos clases con el mismo nombre simple en el mismo archivo: probá los tres escenarios.
package com.facundouferer.tienda.servicio;
import java.util.Date;
public class AuditoriaServicio {
private Date fechaOperacion = new Date();
} Date→java.util.Datepackage com.facundouferer.tienda.servicio;
import java.util.Date;
import java.sql.Date; // ← Date is already defined java.sql.Date→colisión con el import anteriorpackage com.facundouferer.tienda.servicio;
import java.util.Date; // Date sin calificar = java.util.Date
public class AuditoriaServicio {
private Date fechaOperacion = new Date();
private java.sql.Date fechaPersistenciaBD = new java.sql.Date(System.currentTimeMillis());
} Date→java.util.Datejava.sql.Date→java.sql.Date (FQCN inline, sin import)public vs package-private: fronteras de confianza
Los namespaces no son solo carpetas cosméticas: también son límites de visibilidad. El modificador por defecto (package-private) restringe el acceso exclusivamente a clases del mismo paquete. Elegí una clase y un punto de acceso para probarlo.
Reglas para diseñar paquetes y namespaces
Cinco reglas prácticas para que tus namespaces sean únicos, legibles y fáciles de navegar. Tocá cada regla para ver un ejemplo bueno y uno malo.
tienda.dominio.Producto com.facundouferer.tienda.dominio.Producto Tienda.Dominio tienda.dominio Utilidades.java contiene public class Producto Producto.java contiene public class Producto tienda.interfaces / tienda.clases tienda.dominio / tienda.servicio import static java.lang.Math.*; import static java.lang.Math.PI;