En Java, package-private est le niveau d'accès "par défaut" (sans spécifier de modificateurs de visibilité : public, protected, private). Un membre de classe (méthode, champ ou classe elle-même) est accessible uniquement depuis les classes du même package.
class MyClass { /* ... */ } void doSomething() { /* ... */ }
Exemple :
// Fichier : com/example/internal/Helper.java class Helper { static void help() { System.out.println("helped"); } }
Utilisez toujours package-private si la classe ou la méthode est un détail interne de l'implémentation.
Question : Un classe package-private peut-elle être vue dans un autre package via héritage ou import ?
Réponse : Non, on ne peut pas accéder aux membres package-private ni par héritage ni par import depuis d'autres packages — ils ne sont accessibles qu'à l'intérieur de leur propre package.
Histoire
Dans un grand projet, différentes équipes ont commencé à utiliser des classes package-private pour une logique utilitaire. Lorsque le code a été essayé de réutiliser d'autres packages, cela ne fonctionnait pas — l'accès était impossible. En conséquence, il a fallu rendre les classes publiques, ce qui a ouvert l'implémentation interne.
Histoire
Dans un projet multi-modules, les classes package-private ont causé des problèmes lors de l'écriture de tests unitaires : les tests dans un autre package n'ont pas pu voir les méthodes package-private, et il a fallu déplacer les tests à l'intérieur du package source ou amenuiser le niveau d'accès.
Histoire
Lors de la migration de code vers un nouveau package, il y avait des erreurs de compilation inattendues — de nombreuses méthodes et classes ont
disparucar elles étaient package-private et sont devenues inaccessibles après le changement de package.