2015-07-21 1 views
5

J'ai donc travaillé en C# pendant un certain nombre d'années et je travaille maintenant en Java. En C#, vous pouvez utiliser le mot clé internal pour masquer une classe/méthode de la vue publique mais autoriser certains accès assemblies/packages si vous l'accordez spécifiquement. Comme je regarde autour de Java, je ne vois rien qui soit directement identique à l'interne.Existe-t-il un moyen d'utiliser package-private dans java pour permettre l'accès à d'autres paquets?

J'ai découvert le paquet privé. Cependant, cela le garde complètement caché du monde extérieur. Est-il possible en Java de permettre à certains autres paquets d'accéder au code interne sans le rendre public?

Si vous demandez pourquoi je ferais ces réponses sont généralement des tests d'unité/d'intégration ou un besoin d'avoir certains paquets de confiance, l'accès au code pour ne pas le dupliquer. Je sais que certaines personnes pensent que vous ne devriez pas tester le code privé/interne. Je sais aussi que permettre l'accès interne n'est généralement pas une bonne ingénierie logicielle. Je ne suis pas vraiment intéressé par une discussion sur ces sujets, juste curieux si vous pouvez faire ce que je veux faire.

Merci.

+0

Il n'y a pas de mécanisme en Java pour faire ce que vous cherchez. –

+0

Tout au plus vous pourriez protéger votre classe. Il sera alors accessible aux autres classes du même package. – Zahrec

+2

Complément du commentaire de @ Zahrec: et il sera accessible aux autres classes en dehors du paquet si ces autres classes sont un enfant de la classe avec le membre protégé. C'est probablement le plus proche que vous pouvez obtenir ce que vous voulez. –

Répondre

4

Java n'a pas le concept d'assemblys comme dans .NET (du moins pas encore). La chose la plus proche est les bundles OSGi, qui a ce concept (x-internal, x-friend, etc), mais ce n'est pas vraiment le noyau de Java.

Si vous n'utilisez pas OSGi, il ne devrait pas être nécessaire de passer par cette complication. Assurez-vous simplement que vos tests unitaires sont dans le même paquet que la classe testée. La structure du répertoire Maven (qui est un bon choix même si vous n'utilisez pas Maven) vous met en place pour cela avec src/main/java, src/test/java etc.

1

Vous pouvez placer votre test dans le même nom de package à un autre endroit. Ceci est traité comme le même paquet et vous pouvez accéder aux classes privées du paquet. Les classes de test peuvent être placées dans un autre fichier JAR comme testSomething.jar tandis que le paquet testé fait partie du something.jar.

Cela ne fonctionne pas avec les packages scellés.