it-swarm.com.de

Warum gibt es in Java keinen Zugriffsmodifikator nur für Unterklassen?

In Java stehen vier Zugriffsmodifikatoren für Methoden zur Verfügung:

public - Jede Klasse kann diese Methode verwenden.

protected - Klassen im selben Paket und Unterklassen in jedem Paket können diese Methode verwenden.

private - Nur diese Klasse kann diese Methode verwenden.

no modifier ("Paket privat") - Nur Klassen im selben Paket können diese Methode verwenden.

Was oft passiert, ist, dass ich nützliche Methoden in einer Oberklasse haben möchte, die alle Unterklassen verwenden können. Für andere Klassen wäre es jedoch nicht sinnvoll, auf diese Methode zuzugreifen, und in gewissem Sinne würde dies die Kapselung unterbrechen.

Daher muss ich diese nützlichen Methoden in der Oberklasse public oder protected deklarieren, wodurch sie zumindest im Paket allen anderen Klassen zugänglich gemacht werden. Obwohl sie nur für die Unterklassen gedacht sind.

Gibt es einen Grund, warum es in Java keinen Zugriffsmodifikator subclasses-only Gibt? Es scheint mir sehr seltsam. Vermisse ich etwas

Ein Zugriffsmodifikator subclasses-only Ist auch nützlich, wenn Sie Variablen nur für Unterklassen verfügbar machen möchten. Was mir häufig passiert.

18
Aviv Cohn

Weil Sie den Modifikator nur Unterklassen emulieren können, indem Sie den Modifikator protected verwenden und erzwingen, dass sich nur die übergeordnete Klasse und ihre Unterklassen im selben Paket befinden.

Dies ist in der Tat eine gute Vorgehensweise, da die Pakete nicht nur dazu beitragen, große Projekte im Hinblick auf den Zusammenhalt zu organisieren, sondern auch zeigen, dass die Klassen im selben Paket möglicherweise einen gewissen Grad an Kopplung aufweisen.

13

Java hatte ursprünglich einen solchen Modifikator. Es wurde geschrieben private protected aber entfernt in Java 1.0.

Ich gehe davon aus, dass dies ein Urteil war, dass die zusätzliche Komplexität die Kosten nicht wert war.

Jedes Sprachmerkmal hat Kosten: es neuen Programmierern beizubringen; in der Dokumentation; bei der Implementierung in den Compiler-, JVM- und Dev-Tools; in Überlegungen zur Programmkorrektheit; bei der Einschränkung der zukünftigen Sprachentwicklung; und mehr. Sprachmerkmale interagieren miteinander, möglicherweise mit N.2 Wechselwirkungen.

Wie viel Prozent der Java Programmierer haben die Java Sprachspezifikation und VM Spezifikation) gelesen? Ich wette, es ist ein kleiner Prozentsatz, Dies spricht für eine noch einfachere Sprache, um die Verständlichkeit und die technischen Produkte zu verbessern, auf die wir uns verlassen können

Der Nutzen des private protected Feature war klein, da das Paket die Haupteinheit der Modularität ist.

13
Jerry101

Die Zugriffskontrolle kann als Ergebnis einer Besprechung mit einem imaginären Entwickler betrachtet werden, der mit Ihrer Klasse über die Klassenmethoden und -eigenschaften arbeitet ...

SIE: Angenommen, Sie möchten x ausführen, Sie rufen die Methode doX auf. DEV: Erzählen Sie mir mehr. Was sind die Argumente?

Das ist öffentlich ...

SIE: In doX rufe ich an ... DEV: Whoa, zu viele Informationen, das interessiert mich nicht. Ich möchte nur wissen, wie man es benutzt. Erzähl mir was anderes.

Das ist privat...

SIE: Beim Unterklassen habe ich doX und doY call doIt, was funktioniert. DEV: Ja, ich werde Unterklassen, erzähl mir mehr ...

Dies ist geschützt ...

SIE: Ich fahre in einer Stunde in den Urlaub, ich bin für die nächsten 6 Monate weg. Der Chef sagt, dieser Welpe gehört dir! Tschüss. DEV: Warte, geh noch nicht, erzähl mir alles ...

Dies ist ein Paket.

SIE: Die Methode doItWhen wird nur von dieser Klasse aufgerufen und hat sich seit zehn Jahren nicht geändert. Es ... DEV: Whoa, wir haben nur noch 50 Minuten. Nächste Eigenschaft, und schneller sprechen.

Dies ist privat geschützt ...

4
jmoreno

Das gibt es schon. Es ist geschützt.

Sie haben die Kontrolle darüber, welche Klassen im Paket vorhanden sind. Wenn das Paket keine andere Klasse enthält und eine bestimmte Variable oder Methode geschützt ist, handelt es sich um "nur Unterklassen".

Sie haben jedoch erneut die Kontrolle darüber, welche Klassen im Paket vorhanden sind. Sie können die geschützten Methoden oder Variablen einfach nicht verwenden.

3
user40980