Die meisten Antworten hier haben angegeben, dass es in Java kein Unterpaket gibt, aber das ist nicht genau. Dieser Begriff wurde bereits in Java 6 und wahrscheinlich weiter hinten in der Java-Sprachspezifikation verwendet (es scheint keine frei zugängliche Version des JLS für frühere Java-Versionen zu geben). Die Sprache um Unterpakete hat sich im JLS seit Java 6 nicht wesentlich geändert.
Die Mitglieder eines Pakets sind seine Unterpakete und alle Klassentypen der obersten Ebene und Schnittstellentypen der obersten Ebene, die in allen Kompilierungseinheiten des Pakets deklariert sind.
Zum Beispiel in der Java SE Platform API:
- Das Paket
java
hat Subpackages awt
, applet
, io
, lang
, net
, und util
, aber keine Übersetzungseinheiten.
- Das Paket
java.awt
enthält ein Unterpaket mit dem Namen image
sowie eine Reihe von Kompilierungseinheiten, die Deklarationen von Klassen- und Schnittstellentypen enthalten.
Das Unterpaketkonzept ist relevant, ebenso wie die Durchsetzung von Namensbeschränkungen zwischen Paketen und Klassen / Schnittstellen:
Ein Paket enthält möglicherweise nicht zwei Mitglieder mit demselben Namen, oder es tritt ein Fehler beim Kompilieren auf.
Hier sind einige Beispiele:
- Da das Paket
java.awt
ein Unterpaket enthält image
, kann (und darf) es keine Deklaration einer Klasse oder eines Schnittstellentyps mit dem Namen enthalten image
.
- Wenn in diesem Paket ein Paket mit dem Namen
mouse
und einem Mitgliedstyp Button
enthalten ist (der dann als bezeichnet werden kann mouse.Button
), kann es kein Paket mit dem vollständig qualifizierten Namen mouse.Button
oder geben mouse.Button.Click
.
- Wenn
com.nighthacks.java.jag
es sich um den vollständig qualifizierten Namen eines Typs handelt, kann es kein Paket geben, dessen vollständig qualifizierter Name entweder com.nighthacks.java.jag
oder ist com.nighthacks.java.jag.scrabble
.
Diese Namensbeschränkung ist jedoch die einzige Bedeutung, die Unterpakete durch die Sprache erhalten:
Die hierarchische Namensstruktur für Pakete soll praktisch sein, um verwandte Pakete auf herkömmliche Weise zu organisieren, hat jedoch an sich keine andere Bedeutung als das Verbot, dass ein Paket ein Unterpaket mit demselben einfachen Namen wie ein in diesem Paket deklarierter Typ der obersten Ebene aufweist .
Beispielsweise gibt es keine spezielle Zugriffsbeziehung zwischen einem Paket mit dem Namen oliver
und einem anderen Paket mit dem Namen oliver.twist
oder zwischen den Paketen mit dem Namen evelyn.wood
und evelyn.waugh
. Das heißt, der Code in einem Paket mit dem Namen oliver.twist
hat keinen besseren Zugriff auf die im Paket deklarierten Typen oliver
als der Code in einem anderen Paket.
In diesem Zusammenhang können wir die Frage selbst beantworten. Da es explizit keine spezielle Zugriffsbeziehung zwischen einem Paket und seinem Unterpaket oder zwischen zwei verschiedenen Unterpaketen eines übergeordneten Pakets gibt, gibt es innerhalb der Sprache keine Möglichkeit, eine Methode für zwei verschiedene Pakete auf die angeforderte Weise sichtbar zu machen. Dies ist eine dokumentierte, absichtliche Entwurfsentscheidung.
Entweder kann die Methode veröffentlicht werden und alle Pakete (einschließlich odp.proj
und odp.proj.test
) können auf die angegebenen Methoden zugreifen, oder die Methode kann als Paket privat gemacht werden (Standardsichtbarkeit), und der gesamte Code, der für den direkten Zugriff darauf erforderlich ist, muss eingegeben werden das gleiche (Unter-) Paket wie die Methode.
In Java ist es jedoch sehr üblich, den Testcode im selben Paket wie den Quellcode abzulegen, jedoch an einem anderen Ort im Dateisystem. Im Maven- Build-Tool besteht die Konvention beispielsweise darin, diese Quell- und Testdateien in src/main/java/odp/proj
bzw.
abzulegen src/test/java/odp/proj
. Wenn das Build-Tool dies kompiliert, landen beide Dateigruppen im odp.proj
Paket, aber nur die src
Dateien sind im Produktionsartefakt enthalten. Die Testdateien werden nur zur Erstellungszeit verwendet, um die Produktionsdateien zu überprüfen. Mit diesem Setup kann der Testcode frei auf jeden privaten oder geschützten Paketcode des getesteten Codes zugreifen, da er sich im selben Paket befindet.
In dem Fall, in dem Sie Code-Freigabe für Unterpakete oder Geschwisterpakete wünschen, der nicht der Test- / Produktionsfall ist, besteht eine Lösung, die einige Bibliotheken verwendet haben, darin, diesen freigegebenen Code als öffentlich zu kennzeichnen, aber zu dokumentieren, dass er für die interne Bibliothek bestimmt ist nur benutzen.