2015-07-21 6 views
5

So arbeite ich seit einigen Jahren in C# und arbeite jetzt in Java. In C# können Sie das Schlüsselwort intern verwenden, um eine Klasse/Methode vor der öffentlichen Ansicht zu verbergen, aber bestimmten Assemblys/Paketen Zugriff gewähren, wenn Sie dies ausdrücklich zulassen. Wenn ich mich in Java umsehe, sehe ich nichts, was direkt mit dem internen übereinstimmt.Gibt es eine Möglichkeit, package-private in Java zu verwenden, um anderen Paketen den Zugriff zu erlauben?

Ich habe über package-private erfahren. Dies hält es jedoch vollständig vor der Außenwelt verborgen. Gibt es in Java eine Möglichkeit, bestimmten anderen Paketen Zugriff auf internen Code zu gewähren, ohne ihn öffentlich zu machen?

Wenn Sie fragen, warum ich das tun würde Antworten sind in der Regel Unit/Integration Tests oder eine Notwendigkeit, bestimmte, vertrauenswürdige Pakete Zugriff auf Code haben, um es nicht zu duplizieren. Ich weiß, dass einige Leute denken, dass Sie keinen privaten/internen Code testen sollten. Ich weiß auch, dass es im Allgemeinen keine gute Softwareentwicklung ist, wenn man Zugang ins Innere gewährt. Ich bin nicht wirklich an Diskussionen über diese Themen interessiert, nur neugierig, ob Sie tun können, was ich tun möchte.

Danke.

+0

Es gibt keinen Mechanismus in Java, um das zu tun, was Sie suchen. –

+0

Sie können Ihre Klasse höchstens schützen. Es wird dann für andere Klassen in demselben Paket zugänglich sein. – Zahrec

+2

Ergänzt den @ Zahrec-Kommentar: und es wird für andere Klassen außerhalb des Pakets zugänglich sein, wenn diese anderen Klassen ein Kind der Klasse mit dem geschützten Member sind. Dies ist wahrscheinlich die engste, die Sie erreichen können, was Sie wollen. –

Antwort

4

Java hat nicht das Konzept von Assemblies wie in .NET (zumindest noch nicht). Das naheliegendste ist OSGi bundles, das dieses Konzept hat (x-intern, x-friend, etc), aber das ist nicht wirklich Core-Java.

Wenn Sie OSGi nicht verwenden, sollten Sie diese Komplikation nicht durchgehen. Stellen Sie nur sicher, dass sich Ihre Komponententests im gleichen Paket wie die zu testende Klasse befinden. Die Maven-Verzeichnisstruktur (die eine gute Wahl ist, selbst wenn Sie Maven nicht verwenden) stellt Sie mit src/main/java, src/test/java usw. ein.

1

Sie können Ihren Test an einem anderen Ort in denselben Paketnamen eingeben. Dies wird als dasselbe Paket behandelt und Sie können auf die privaten Paketklassen zugreifen. Die Testklassen können in einer anderen JAR-Datei wie testSomething.jar platziert werden, während das getestete Paket Teil something.jar ist.

Dies funktioniert nicht mit versiegelten Paketen.

Verwandte Themen