Java Getriebe

Java und NetBeans

Java Namespaces

Ich merke bei meinen Azubis immer mal wieder, dass ihnen der Sinn oder Unsinn der Paket-Anweisung (package) nicht ganz bewusst ist. Die Klassen werden zwar in irgendein Paket abgelegt, aber warum unsere Paket alle ausgerechnet mit de.rwthaachen.wzl.gt wird nicht hinterfragt. So kommt es gerade bei den ersten eigenen Projekten regelmäßig vor, dass als Paket de.nachname.projekt verwendet wird. Meist blicke ich dann ich weit aufgerissene Augen wenn ich Frage „gehört dir die Domain ’nachname.de‘ überhaupt?“

In der englischen Wikipedia existiert sogar ein eigener Artikel zum Thema „Java package„. Dort fällt auch der Begriff „Namespace“ oder „Namensraum. Ein Verfahren um die Benennung von einzelnen Klassen zu organisieren. Namensräume sind immer dann wichtig, wenn die Möglichkeit besteht, dass jemand (oder verschiedene Leute) einer Klasse den gleichen Namen gibt bzw. geben.

Schon in der JDK gibt es mehrere Beispiele davon. So gibt es zum Beispiel die Klasse „List“ sowohl im Paket „java.util“ als auch in „java.awt„. Beide mit recht unterschiedlichen Aufgaben. Ohne die Namensräume „java.util“ und „java.awt“ müsste der Compiler und später die Laufzeitumgebung raten, welche der beiden „List„-Klassen denn nun gemeint ist. Ärgerlich, wenn sich beide nicht einig sind. Durch die Namensräume heißen die beiden Klassen aber nicht „List“ sondern mit ihrem vollständigen Klassennamen „java.util.List“ und „java.awt.List“ und sind somit für den Compiler und der Laufzeitumgebung jederzeit eindeutig identifizierbar.

Bleibt die Frage, was das mit dem Domainnamen einer Webseite zu tun hat. Die Frage die man da zusätzlich stellen muss ist

Welchen Paketnamen verwende ich für meine eigenen Klassen und wie stelle ich sicher, dass kein anderer auf die Idee kommt den gleichen Paketnamen zu verwenden?

Einfach „land.nachname.projekt“ zu verwenden funktioniert nicht. Ich will nicht wissen wie viele „Müller“ oder „Schmidt“ ein Projekt „Konverter“ erstellen. Könnte interessant werden wie die sich alle absprechen um keinen Klassennamen doppelt zu vergeben. Als „Lösung“ hat sich eine Konvention entwickelt bei der man den eigenen Domainnamen den man selber besitzt verwendet und in umgekerter Reihenfolge Elementweise als Paketnamen verwendet. Aus einem „http://nigjo.de“ wird also „de.nigjo“ oder aus dem Projekt „https://github.com/nigjo/NBRelaseFilesView“ wird das Paket „com.github.nigjo.nbrelesefilesview 1„.

Schwierig wird es nur, wenn man außer Buchstaben und Zeichen andere Symbole wie das Minuszeichen im Domainnamen hat oder man besitzt gar eine so genannte „Umlautdomain“ besitzt. Für einen solchen Fall gibt es Vorschläge in der offiziellen Dokumentation zur Java Spezifikation.

Notes:

  1. OK, bei dem Projekt habe ich ein de.nigjo Paket verwendet, aber ihr wisst, was ich meine

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.