web-dev-qa-db-fra.com

Lors de la création d'une bibliothèque, il existe un moyen de faire certaines classes entièrement internes à la bibliothèque et non exposées à l'utilisateur de la bibliothèque?

Supposons que vous conceviez un Java Library pour d'autres personnes à utiliser. Vous compilez la bibliothèque dans un pot qu'ils peuvent importer dans leurs projets et utiliser.

Inutile de dire que vous souhaitez utiliser la bibliothèque d'être utilisée de certaines manières et à travers certaines interfaces. Par exemple, vous pouvez créer plusieurs classes de façade pour contrôler la bibliothèque et, dans la documentation, vous indiquez comment la bibliothèque doit être utilisée, quelle classe et chaque méthode est utilisée pour, etc.

Mais existe-t-il un moyen de cacher complètement une certaine classe de l'utilisateur? Dans chaque bibliothèque, il existe certaines classes (je suppose généralement la majorité des classes), qui sont utilisées à l'intérieur de la bibliothèque et ne sont pas censées être utilisées directement par le code à l'aide de la bibliothèque.

Existe-t-il un moyen pour moi d'indiquer "Cette classe est destinée à l'usage interne de cette bibliothèque à l'intérieur de ce bocal ou à l'intérieur de ce paquet, il ne peut pas être utilisé en dehors des limites de cette bibliothèque"? Est-ce techniquement possible? Ou devrais-je simplement dire dans les documents que certaines bibliothèques ne devraient pas être utilisées par l'utilisateur, et c'est tout?

8
Aviv Cohn

Utilisez package-private, Qui est ce que vous obtenez lorsque vous spécifiez aucun modificateur d'accès. Il limite une classe ou une méthode pour être visible uniquement pour l'emballage.

package animals;

public class Animal { ... };

public class Giraffe extends Animal {
    void run() { ... }
    public void jump() { ... }
}

class Platypus extends Animal { ... }

Tout code que imports le package animals sera en mesure de voir la classe Animal et la classe Giraffe, mais pas la classe Platypus. De plus, ce code pourra appeler la méthode Giraffe.jump(), mais non la méthode Giraffe.run() méthode. Toutefois, à l'intérieur L'emballage, les deux méthodes Giraffe ainsi que la classe Platypus sont visibles.

Notez que cela ne fonctionne pas pour les packages imbriqués, vous ne pouvez donc pas avoir une classe package-privée dans le package A être visible aux classes dans le paquet A.B. C'est parce que les packages imbriqués ne sont pas vraiment imbriqués, ils sont traités par Java comme deux paquets distincts et ont Aucune relation particulière avec l'autre. Les paquets A et A.B n'interagissent pas différemment de tout autre paquet.

10
Jack