Kurzantwort
Es kann hilfreich sein, wenn es einige Elemente in dem Modul sind die für dieses Modul im Wesentlichen öffentlich sind, sollte aber nicht außerhalb dieses Moduls zugänglich sein.
Das ist nicht möglich. (Mit Hilfe des Modulsystem allein - es gibt eine Abhilfe.)
Lange Antwort
Die Erklärung innerhalb der Frist liegt Accessibility:
der Java-Compiler und virtuelle Maschine die öffentlichen Typen betrachten in ein Paket in einem Modul zu zugänglich durch Code in einem anderen Modul nur dann, wenn das erste Modul von dem zweiten Modul in dem oben definierten Sinne gelesen werden kann, und das erste Modul dieses Paket exportiert. [...]
Ein über Modulgrenzen hinweg referenzierter Typ, auf den nicht zugegriffen werden kann, ist auf die gleiche Weise wie eine private Methode oder ein Feld unbrauchbar: Jeder Versuch, sie zu verwenden, führt zu einem Fehler der Compiler oder ein IllegalAccessError
, der von der Java Virtual Machine ausgelöst werden soll, oder ein IllegalAccessException
, der von den reflektiven Laufzeit-APIs ausgelöst wird. [...]
Eine Methode oder ein Feld, auf das über Modulgrenzen hinweg verwiesen wird, ist zugänglich, wenn der einschließende Typ in diesem Sinne zugänglich ist und wenn die Deklaration des Elements selbst auch den Zugriff erlaubt.
Zwar gibt es verschiedene Möglichkeiten, wie genau und ein Paket, die exportiert werden kann, wenn der Compiler/JVM eine Art zugänglich kein zusätzlicher Mechanismus gilt hält. Seine Mitglieder sind so zugänglich wie vor Jigsaw.
Dies bedeutet, dass es keine Möglichkeit gibt, die Mitglieder eines zugänglichen Typs innerhalb des Moduls sichtbar zu machen (das würde public
erfordern), aber nicht außerhalb (weil ein öffentliches Mitglied eines zugänglichen Typs zugänglich ist).
Umgehung
So ist eine andere Möglichkeit, es in Zukunft Java 9 zu tun?
Ja. :)
Sie können eine öffentliche Schnittstelle Global
in einem exportierten Paket haben, das die Methoden definiert, die Sie in die Welt exportieren möchten. Dann haben Sie entweder eine Schnittstelle oder eine Klasse Local
extend Global
und fügen Sie alle gewünschten Mitglieder hinzu. Schlüssel ist, dass Local
nicht in einem exportierten Paket sein muss!
Wenn nun die API Ihres Moduls nur Global
-s zurückgibt, sie aber nie als Argument für die Methode akzeptiert, können Sie loslegen. Stellen Sie nur sicher, dass intern Sie immer verwenden - und möglicherweise zu Local
werfen.
Wenn Sie auch Global
-s akzeptieren, müssen Sie eindeutig dokumentieren, dass dies nur Instanzen sein können, die Ihre API zurückgegeben hat (d. H. Der Benutzer darf keine eigene Implementierung erstellen). Das hört sich vielleicht unerschwinglich an, aber wenn Sie über Ihre ursprüngliche Anfrage nachdenken, würde es dieselben Eigenschaften haben.
Zu meinem Verständnis sind Module standardmäßig genagelt geschlossen. Sie müssen Dinge explizit exportieren, um sie von außen anforderbar zu machen. http://openjdk.java.net/projects/jigsaw/quick-start und https://en.wikipedia.org/wiki/Java_Module_System. Versteh ich nur falsch, worüber du hier fragst? – Gimby
Gemäß [Der Status des Modulsystems] (http://openjdk.java.net/projects/jigsaw/spec/sotms/) sind nur Pakete, die exportiert werden, außerhalb des Moduls verfügbar. Siehe auch [diese Tabelle] (http://stackoverflow.com/questions/215497/in-java-difference-between-default-public-protected-and-private/33627846#33627846) zum Beispiel. – aioobe
@Gimby Sie haben recht: Es ist möglich, bestimmte Pakete zu exportieren. Aber was ist mit Methoden und Feldern? Ja, ich denke du verstehst meine Frage richtig. – Andremoniy