En Java, package-private es el nivel de acceso "por defecto" (sin especificar modificadores de visibilidad: public, protected, private). Un miembro de clase (método, campo o la propia clase) es accesible solo desde clases del mismo paquete.
class MyClass { /* ... */ } void doSomething() { /* ... */ }
Ejemplo:
// Archivo: com/example/internal/Helper.java class Helper { static void help() { System.out.println("ayudado"); } }
Siempre use package-private si la clase o el método son detalles internos de la implementación.
Pregunta: ¿Puede una clase package-private ser visible dentro de otro paquete a través de la herencia o importación?
Respuesta: No, no se puede acceder a miembros package-private ni a través de herencia ni a través de importaciones desde otros paquetes; solo son accesibles dentro de su paquete.
Historia
En un gran proyecto, diferentes equipos comenzaron a usar clases package-private para lógica utilitaria. Cuando el código intentó ser reutilizado desde otros paquetes, no se logró — el acceso era imposible. Como resultado, tuvieron que hacer las clases public, lo que abrió la implementación interna.
Historia
En un proyecto modular, las clases package-private causaron problemas al escribir pruebas unitarias: las pruebas en otro paquete no podían ver los métodos package-private, y tuvieron que mover las pruebas dentro del paquete de origen o relajar el nivel de acceso.
Historia
Al migrar código a un nuevo paquete, surgieron errores inesperados en tiempo de compilación — muchos métodos y clases "desaparecieron" de repente, porque eran package-private y se volvieron inaccesibles después del cambio de paquete.