it-swarm.com.de

Warum sind Pakete und Module in Java 9) separate Konzepte?

Java 9 wird zusätzlich zu den Paketen Module enthalten. Normalerweise haben Sprachen die eine oder andere. Und die meisten Programmierer wahrnehmen zwei Begriffe als Synonyme. Module werden auf Paketen aufgebaut und als Grundelemente behandelt. Das zusammengesetzte Muster schlägt vor, Primitive und Verbundstoffe einheitlich zu behandeln. Sonst passieren schlimme Dinge. Schauen Sie sich zum Beispiel das Projekt Valhalla an, in dem versucht wird, den allgemeinen Supertyp für primitive (Wert) und Referenztypen nachzurüsten.

Stellen Module und Pakete semantisch getrennte Begriffe dar? Das heißt, es ist sinnvoll, beide für jede Sprache zu haben (Trennung von Bedenken). Oder Java muss beides als Tribut an die Abwärtskompatibilität haben?

Warum ein neues Konzept einführen, anstatt das bestehende zu erweitern?


JSR 376 : "Java-Plattformmodulsystem" im Projekt implementiert Jigsaw .

Nach SOTMS

Ein Modul ist eine benannte, selbstbeschreibende Sammlung von Code und Daten. Sein Code ist als eine Reihe von Paketen organisiert, die Typen enthalten, d. H. Java Klassen und Schnittstellen; seine Daten enthalten Ressourcen und andere Arten statischer Informationen.

JLS vermeidet sorgfältig die Definition eines Pakets . Von Wikipedia :

Ein Java -Paket ist eine Technik zum Organisieren von Java Klassen in Namespaces ähnlich den Modulen von Modula, die eine modulare Programmierung in Java ermöglichen.

Ich weiß, dass das Zitieren von Wikipedia eine schlechte Praxis ist, aber es spiegelt das allgemeine Verständnis wider. Von Eintrag zur modularen Programmierung:

Der Begriff Paket wird manchmal anstelle des Moduls verwendet (wie in Dart, Go oder Java). In anderen Implementierungen ist dies ein bestimmtes Konzept. in Python ein Paket ist eine Sammlung von Modulen, während im kommenden Java 9 die Einführung des neuen Modulkonzepts (eine Sammlung von Paketen mit erweiterter Zugriffskontrolle) ) ist geplant.

22
user2418306

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, da sie versteckte Interna (den Code und lokale Variablen) und einen Vertrag (die Parameter und den Rückgabetyp) enthält. Module können aus Modulen niedrigerer Ebene zusammengesetzt sein, z. Klassen enthalten Methoden.

Was im Kern fehlt Java (vor 9)) ist ein implementierbar Modul. Alle oben genannten Modultypen sind keine bereitstellbaren Einheiten, die kopiert werden können. Java hat ein bereitstellbares Artefakt, das als JAR-Datei bezeichnet wird, aber dies sind keine Module, da sie keine Kapselung oder keinen Vertrag haben: Zur Laufzeit verschwinden JAR-Dateien und werden alle zu einem einzigen "Klassenpfad" zusammengeführt.

OSGi hat 1998 mit dem Konzept eines "Bundles" den Mangel an einsetzbaren Modulen behoben. Hierbei handelt es sich um physische JAR-Dateien, die Pakete enthalten. OSGi definiert jedoch 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 bereitstellbaren 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 das neue Modulkonzept nur als "Modul" bezeichnet wird. Dies bedeutet nicht, dass Methoden, Klassen und Pakete keine Module mehr sind! Ein J9 "Modul" ist nur eine weitere Instanziierung des Moduls Konzept. 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 Java muss sein bestehendes Paketkonzept aus Gründen der Abwärtskompatibilität beibehalten. Beachten Sie, dass das Word-Paket in Java anders verwendet wird als in anderen Sprachen oder in) Paketverwaltungssysteme wie RPM. Die neuen J9-Module (und OSGi-Bundles) ähneln viel eher Paketen in RPM als Java -Pakete waren es jemals.

22
Neil Bartlett

Lassen Sie mich eine Antwort riskieren, obwohl ein Großteil davon Annahmen/Haarspalterei/Schimpfen usw. sein kann.

Sind sie dasselbe? Nun, ja und nein

Von dieser JavaWorld-Artikel über "Modularität in Java 9" :

Pakete als modulare Lösung

Pakete versuchen, der Java Programmierlandschaft) eine Abstraktionsebene hinzuzufügen. Sie bieten Funktionen für eindeutige Codierungsnamespaces und Konfigurationskontexte. Leider können Paketkonventionen leicht umgangen werden, was häufig zu einer Umgebung von führt gefährliche Kopplungen zur Kompilierungszeit.

Wie @ser2418306 (OP) angedeutet, " Module sind Pakete, die richtig gemacht wurden ". Module und Pakete in Java (ab Java 9, offensichtlich)) sind (wie OP verlangt) semantisch dasselbe Das heißt, es handelt sich um Sammlungen von vorkompiliertem JVM-Bytecode mit anderen Metadaten - im Wesentlichen, sie sind 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 nicht oft verwaltet, und sie bieten auch keinen sicheren Vertrag darüber, was die JAR/das Paket bietet. As - hier erklärt (wieder JavaWorld-Artikel) :

Sind JAR-Dateien nicht modular genug?

JAR-Dateien und die Bereitstellungsumgebung, in der sie ausgeführt werden, verbessern die vielen anderen ansonsten verfügbaren Bereitstellungskonventionen erheblich. JAR-Dateien weisen jedoch keine eindeutige Eindeutigkeit auf, abgesehen von einer selten verwendeten Versionsnummer, die in einem .jar-Manifest verborgen ist. Die JAR-Datei und das optionale Manifest werden nicht als Modularitätskonventionen in der Laufzeitumgebung Java) verwendet. Daher sind die Paketnamen der Klassen in der Datei und ihre Teilnahme an einem Klassenpfad die einzigen Teile der JAR Struktur, die der Laufzeitumgebung Modularität verleiht.


Ein Scherz über andere Sprachen/Umgebungen usw.

Ein weiterer Bereich in diesem Artikel beschrieben sind Systeme wie Maven , die im Rahmen des Erstellungsprozesses Abhängigkeiten für Sie verwalten. Von diese Seite auf der Apache Maven-Website :

Abhängigkeitsmanagement:

Maven empfiehlt die Verwendung eines zentralen Repositorys für JARs und andere Abhängigkeiten. Maven verfügt über einen Mechanismus, mit dem die Kunden Ihres Projekts alle zum Erstellen Ihres Projekts erforderlichen JARs aus einem zentralen JAR-Repository herunterladen können, ähnlich wie bei Perls CPAN. Auf diese Weise können Benutzer von Maven JARs projektübergreifend wiederverwenden und die Kommunikation zwischen Projekten fördern, um sicherzustellen, dass Probleme mit der Abwärtskompatibilität behoben werden.

Nun, um über die Zukunft zu sprechen, als wäre ich dort gewesen

Wie diese Seite erwähnt, haben andere Sprachen (wie Perl) Paket-Repositorys (wie CPAN ). Dies ist ein zunehmender Trend (ich sage, weil ich Lust dazu habe, ohne nachdrücklichen Beweis) in den letzten zehn Jahren oder so. Tools wie Ruby's gems , Python's PyPi und der Node Package Manager (npm) bauen darauf auf, um eine konsistente Bereitstellung zu gewährleisten Art und Weise, eine Umgebung (entweder Entwicklung, Build, Test oder Laufzeit usw.) mit dem richtigen Zeug (Pakete, Module, Edelsteine, Gizmos usw.) zu konfigurieren. Eine Idee (ich fühle) war " ausgeliehen" von Linux®-Distributionssystemen wie Debians apt , RedHats rpm usw. (Obwohl sich offensichtlich mindestens eins entwickelt hat = Generation und machte diese Dinge alle schöner.)


Java Module, obwohl sie nicht unbedingt etwas hinzufügen, was Sie noch nicht tun können, erstellen Sie Tools für Abhängigkeiten/Paketverwaltung und automatisierte Build-Umgebungen [~ # ~ ] viel [~ # ~] einfacher. Ob das Module "besser" macht, lehne ich ab zu sagen. : P.

10
Tersosauros