Java 9 wird Module zusätzlich zu Paketen enthalten. Normalerweise haben Sprachen die eine oder andere. Und die meisten Programmierer nehmen zwei Begriffe als Synonyme wahr . Module werden auf Paketen aufgebaut und als Grundelemente behandelt. Ein zusammengesetztes Muster legt nahe, Grundelemente und Verbundwerkstoffe gleichmäßig zu behandeln. Sonst passieren schlimme Dinge. Schauen Sie sich zum Beispiel das Projekt Valhalla an, in dem versucht wird, gängige Supertypen für primitive (Wert) und Referenztypen nachzurüsten.
Sind Module und Pakete semantisch getrennte Begriffe? Das heißt, es ist sinnvoll, für jede Sprache beides zu haben (Trennung der Anliegen). Oder muss Java beides als Tribut an die Abwärtskompatibilität haben?
Warum ein neues Konzept einführen, anstatt das bestehende zu erweitern?
JSR 376 : "Java Platform Module System" implementiert im Rahmen des Projekts Jigsaw .
Laut SOTMS
Ein Modul ist eine benannte, selbstbeschreibende Sammlung von Code und Daten. Sein Code ist in Paketen organisiert, die Typen enthalten, dh Java-Klassen und -Schnittstellen. Seine Daten umfassen Ressourcen und andere Arten statischer Informationen.
JLS vermeidet sorgfältig, zu definieren, was ein Paket ist . Aus Wikipedia :
Ein Java-Paket ist eine Technik zum Organisieren von Java-Klassen in Namespaces, die den Modulen von Modula ähneln und eine modulare Programmierung in Java ermöglichen.
Ich weiß, dass das Zitieren von Wikipedia eine schlechte Praxis ist, aber es spiegelt allgemeines Verständnis wider. Vom Einstieg in die modulare Programmierung:
Der Begriff Paket wird manchmal anstelle von Modul verwendet (wie in Dart, Go oder Java). In anderen Implementierungen ist dies ein unterschiedliches Konzept. In Python ist ein Paket eine Sammlung von Modulen, während in Java 9 die Einführung des neuen Modulkonzepts (eine Sammlung von Paketen mit erweiterter Zugriffskontrolle) geplant ist.
quelle
jigsaw
-Style-Module nur eine technische Verbesserung gegenüber Paketen? 3) (wenn nicht 1 und wenn 2), behält Java einfach (oder scheinbar) beide Konzepte für die Abwärtskompatibilität bei. Einige dieser Fragen sind beantwortbar, andere sind in erster Linie meinungsorientiert. Ich denke, eine Änderung zur Vereinfachung der angestrebten Klarstellung ist hier angebracht.package
lautet / bedeutet /, und sie werden auch nicht zu (seien wir ehrlich, ziemlich schrecklich) Klassenpfadsystemen in der JRE wechseln. Frage Nr. 2 ist meiner Meinung nach in erster Linie meinungsorientiert (sie ist beantwortbar , aber meine Antwort und die einer anderen Person können sich unterscheiden, und keiner von uns würde sich notwendigerweise irren).Antworten:
Das Konzept eines Moduls unterscheidet sich von der Instanziierung dieses Konzepts.
Java hatte schon immer Module. Eine Methode ist ein Modul, eine Klasse und ein Paket. Ein Modul ist eine Organisationseinheit, in der interne Details verborgen sind und die über vereinbarte Verträge mit anderen Modulen kommuniziert. Eine Methode ist beispielsweise ein Modul, weil sie verborgene Interna (den Code und lokale Variablen) und einen Vertrag (die Parameter und den Rückgabetyp) enthält. Module können aus untergeordneten Modulen zusammengesetzt sein, zB Klassen enthalten Methoden.
Was in Kern-Java (vor 9) fehlt, ist ein implementierbares Modul. Alle oben genannten Modultypen sind keine implementierbaren Einheiten, die kopiert werden können. Java verfügt zwar über ein implementierbares Artefakt, das als JAR-Datei bezeichnet wird, dies sind jedoch keine Module, da sie keine Kapselung oder keinen Vertrag enthalten: Zur Laufzeit verschwinden JAR-Dateien, die alle zu einem einzigen "Klassenpfad" zusammengeführt werden.
OSGi begegnete dem Mangel an implementierbaren Modulen im Jahr 1998 mit dem Konzept eines "Bundles". Dies sind physisch JAR-Dateien und sie enthalten Pakete, aber OSGi definiert zusätzliche Metadaten zusammen mit einem Laufzeitsystem, um die Kapselung und Verträge auf dieser Ebene zu unterstützen.
Java 9 behebt den Mangel an implementierbaren Modulen auf ähnliche Weise wie OSGi. Das war wohl völlig unnötig, weil OSGi existiert und funktioniert, aber das ist eine ganz andere Diskussion ...
Leider trübt Java 9 das Wasser, indem es das neue Modulkonzept nur als "Modul" bezeichnet. Dies bedeutet nicht, dass Methoden, Klassen und Pakete keine Module mehr sind! Ein J9 „Modul“ ist nur eine weitere Instanziierung des Moduls Konzepts . Wie OSGi-Bundles bestehen J9-Module aus Paketen und sind physische Artefakte (normalerweise wieder JAR-Dateien), die kopiert werden können. Das Laufzeitsystem versteht und überprüft sie.
Zusammenfassung: ja J9-Module und -Pakete sind semantisch getrennte Begriffe. Offensichtlich muss Java sein vorhandenes Paketkonzept beibehalten, um die Abwärtskompatibilität zu gewährleisten. Beachten Sie, dass das Wort "package" in Java ganz anders verwendet wird als in anderen Sprachen oder in Paketverwaltungssystemen wie RPM. Die neuen J9-Module (und OSGi-Bundles) ähneln Paketen in RPM weitaus mehr als Java-Pakete.
quelle
import
kann Pakete koppeln. Es gibt jedoch keine Möglichkeit, Pakete als Bürger erster Klasse zu strukturieren. Diese Mängel (und Einschränkungen von OSGi) sind in JSR 376 beschrieben.Lassen Sie mich bei einer Antwort riskieren, auch wenn viele davon Vermutungen / Haarspalterei / Schimpfen usw. sein mögen.
Sind sie dasselbe? Nun, ja und nein
Aus diesem JavaWorld-Artikel über "Modularität in Java 9" :
Wie @ user2418306 (OP) andeutete, sind " Module richtig gemachte Pakete " . Module und Pakete in Java (ab Java 9 natürlich) sind (wie OP fragt) semantisch dasselbe. Das heißt, es handelt sich um Sammlungen von vorkompiliertem JVM-Bytecode mit anderen Metadaten - im Wesentlichen handelt es sich um Bibliotheken .
Was ist der Unterschied?
Der Unterschied liegt jedoch in den Metadaten in jedem von ihnen. Java-
package
Manifeste oder JAR-Manifeste werden von Bibliotheksentwicklern häufig nicht verwaltet und bieten auch keinen sicheren Vertrag darüber, was die JAR / das Paket bereitstellt. Wie hier erklärt (JavaWorld-Artikel erneut) :Eine Schimpfe über andere Sprachen / Umgebungen usw
Ein weiterer in diesem Artikel behandelter Bereich sind Systeme wie Maven , die Abhängigkeiten für Sie als Teil des Erstellungsprozesses verwalten. Von dieser Seite auf der Apache Maven-Site :
Nun, um über die Zukunft zu sprechen, als wäre ich dort gewesen
Wie auf dieser Seite bereits erwähnt, verfügen andere Sprachen (wie Perl) über Paket-Repositorys (wie CPAN ). Dies ist ein zunehmender Trend (ich sage, weil ich das Gefühl habe, ohne jeden nachdrücklichen Beweis) im letzten Jahrzehnt oder so. Tools wie Ruby Edelsteine , Pythons PyPI und der Knoten Paket - Manager (
npm
) als Grundlage für eine konsistente Art und Weise , um eine Umgebung zu konfigurieren (entweder Entwicklung, Build, Test oder Laufzeit, usw.) mit dem richtigen Material (Pakete, Module, Edelsteine, Gizmos usw.). Eine Idee (ich fühle mich) wurde „ ausgeliehen “ von Linux® Verteilungssysteme wie Debians apt , RedHatsrpm
, etc. (Obwohl sich offensichtlich mindestens eine Generation weiterentwickelt hat und all diese Dinge schöner gemacht hat.)Java- Module fügen zwar nicht notwendigerweise etwas hinzu, was Sie noch nicht tun können, vereinfachen jedoch das Tooling für Abhängigkeiten / Paketverwaltung und automatisierte Build-Umgebungen VIEL . Ob das Module "besser" macht, möchte ich nicht sagen. : P
quelle
classpath
und unterstützenmodulepath
. Und springen Sie durch die Reifen, um das Testen von Einheiten zu unterstützen. Die Annahme, dass zwei Konzepte gleichwertig sind, weil sie eine Sammlung von Dingen und Metadaten darstellen, ist zu kühn, als dass ich sie akzeptieren würde. In der Zwischenzeit haben Sie das Paket durch ein Glas ersetzt.