Package Private Access

Logo: Java
Um die Sichtbarkeit von Methoden oder Feldern zu beschränken gibt es Schlüsselwörter wie public, private oder protected. In Java gibt es zusätzlich noch die Möglichkeit die Sichtbarkeit auf das Paket zu beschränken. Nicht nur, dass man hierfür einfach kein Schlüsselwort benutzt, die Paketsichtbarkeit macht zudem überhaupt keinen Sinn. Am besten sollte die Verwendung ohnehin unterbunden werden.
Schaut man sich eine Klasse an und sieht, dass ein Feld keine Sichtbarkeit besitzt so ist nicht abzuleiten ob dies einfach vergessen wurde festzulegen, oder ob es absichtlich auf Paketebene sichtbar gemacht wurde. Man kann hier nur schlicht raten. Gründe dafür gibt es jedenfalls keine.
Ein Grund, der angeblich einer sein soll, ist die Möglichkeit des Zugriffs von Unittests. Tests werden im selben Paket angelegt wie die zu testende Klasse. Nun möchte man in einer Methode einige Felder private haben ohne diese nach Außen hin irgendwie sichtbar zu machen. Würde man die Felder nun auf Paketebene sichtbar machen, so könnte ein Unittest diese abfragen.
Klingt super, ist aber nur ein Beweiß dafür, dass der Entwickler des Tests keine Ahnung von Unittests hat. Tests sollten die Klasse so testen wie sie später auch wirklich eingesetzt wird. Öffentliche Methoden sollten angesprochen werden und ihr Ergebnis sollte mit dem zu erwartenden übereinstimmen. Das kann ein simples Result sein oder auch eine komplizierte Handler-Logik. Was innerhalb der Klasse passiert, sollte dem Test völlig egal sein. Selbst wenn die Klasse durch eine andere ersetzt wird, die genau das gleiche macht nur unterschiedlich programmiert wurde, sollte der Test erfolgreich sein. Wie viele oder welche privaten Methoden oder Felder dabei verwendet werden sollte vollkommen egal sein. Wenn ein Feld einer Klasse nach Außen hin nicht sichtbar ist, dann hat es auch nichts in einem Unittest verloren.
Der zweite Grund, der gerne einmal aufgeführt wird, wenn man über den Sinn und Zweck von Paketsichtbarkeit redet sind Factories. Factories sind einem Java-Entwickler sein liebstes Pattern. Klar, dass die Paketsichtbarkeit für irgendetwas gut sein muss. Mächte man einen beispielsweise eine Klasse nur von der Factory erzeugen lassen können, so kann dessen Konstruktor auf Paketebene sichtbar gemacht werden, damit nur die Faktory ihn sehen kann. Ist das nicht super? Naja, mehr oder weniger. Das Problem ist, dass in diesem Fall jede Faktory im selben Paket wie die Klasse liegen muss  Das schränkt ein. Statt einer aufgeräumten Struktur wird man nun gezwungen alles in ein Paket zu packen. Ob das nun so viel besser ist mag ich zu bezweifeln.
Bookmark and Share

0 Kommentare:

Kommentar veröffentlichen