El problema

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.

Mismo nombre, mismo espacio: el compilador no puede elegir.
Espacio global (sin namespaces)
Usuario Usuario
Date Date

Colisión: el compilador no sabe qué clase Usuario (o Date) estás pidiendo.

Namespace físico

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.

Árbol de carpetas
  • com
    • facundouferer
      • tienda
        • dominio
        • servicio
Declaración requerida package com.facundouferer.tienda.dominio; FQCN: com.facundouferer.tienda.dominio.Producto
Compila: el package coincide exactamente con la carpeta tienda/dominio/.
Identidad de clase

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.

com.facundouferer .tienda .dominio .Producto

Tocá "Agregar siguiente pieza" para empezar a construir el FQCN.

Alias léxico

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.Date
Compila: Date se resuelve sin ambigüedad al único import presente.
Encapsulamiento de namespace

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.

com.tienda.dominio
public class Producto
class ProductoValidator
com.tienda.dominio punto de acceso
Clase objetivo
Origen del acceso
Acceso permitido: Producto es public, visible desde cualquier paquete.
Buenas prácticas

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.