Bei mehr als einer Gelegenheit habe ich mir eine variable Sichtbarkeit gewünscht, die in Java nicht möglich ist. Ich wollte, dass bestimmte Mitglieder innerhalb ihrer eigenen Klasse und innerhalb von Unterklassen sichtbar sind, aber nicht für den Rest des Pakets oder für den Rest der Welt. Mit anderen Worten, ich wollte das:
Modifier Class Package Subclass World
sub-class Y N Y N
Die Entwickler von Java Allerdings gab nur mir dies :
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Der typische Fall, wenn ich so etwas möchte, ist das Erstellen einer abstrakten Klasse. Manchmal finde ich, dass der abstrakte Elternteil Zugang zu bestimmten Mitgliedern benötigt, aber auch konkrete Kinder. Ich kann ihnen diesen Zugang gewähren, indem ich die Mitglieder mache protected
, aber das eröffnet den Zugang zum Rest des Pakets, wenn ich nicht wirklich will.
Um ganz klar zu sein, ich weiß, dass ein solcher Modifikator in Java nicht möglich ist. Meine Frage ist, warum ein solcher Modifikator nicht in Java enthalten ist. Es scheint (für mich) eine natürlichere Sichtbarkeitsstufe zu sein als entweder protected
oder die Standardeinstellung. Ist der Grund dafür nicht wichtig genug, um aufgenommen zu werden, oder hängt er eher mit möglichen Nebenwirkungen zusammen, die ich nicht berücksichtigt habe?
quelle
private protected
. Ich glaube, die Implementierung war fehlerhaft. In 1.1 fallen gelassen.Antworten:
Ich nehme an, sie möchten die zusätzliche Komplexität vermeiden, indem sie eine nichtlineare Zugriffshierarchie haben.
Sie sollten die Kontrolle über Ihr Paket haben, also rufen Sie diese geschützten Methoden dort einfach nicht auf.
( Ist übrigens
protected
nicht ganz dasselbe wiesub-class and package
, da nicht statisch geschützte Methoden (wenn nicht im selben Paket) nicht für beliebige Objekte der deklarierenden Klasse aufgerufen werden können, sondern nur für Objekte der Unterklasse, in der sich der Code befindet (Sie können dies sehenObject.clone()
, das nur von der Klasse aufgerufen werden kann, deren Objekt geklont wird.))quelle
protected
ist ein bisschen weniger. Obwohl jede Klasse von erbtObject
(dhclone()
überall sichtbar sein sollte), können Sie keinanyObject.clone()
beliebiges Objekt aufrufen .private
Mitglieder einer anderen Instanz derselben Klasse zugreifen . Sie würden denken, weil ein Mitglied istprivate
, sollte nur diese Instanz darauf zugreifen können, aber wie @ PaŭloEbermann sagte, hätten Sie bereits die volle Kontrolle über die Klasse. Wenn Sie aufprivate
Mitglieder einer anderen Instanz zugreifen , liegt dies daran, dass Sie sie so entworfen haben. Wenn Sie ein Paket entwickeln und auf einprotected
Mitglied einer anderen Klasse zugreifen , liegt dies daran, dass Sie derjenige sind, der dieses Paket entwickelt, auf das andere keinen Zugriff haben.Im selben Paket zu sein, wird einfach als engere Beziehung angesehen als ein Subtyp zu sein .
Warum?
Normalerweise steuern Sie den gesamten Quellcode des Pakets, das Sie entwickeln (*) , sodass Sie zumindest die Möglichkeit haben , fehlerhafte Aufrufe zu vermeiden.
Sie steuern nicht den gesamten Code, der Ihre Klassen erweitert. (Jeder kann Ihre Klasse erweitern.) Dies bedeutet, dass der private Paketzugriff eine wichtigere Rolle spielt.
*) Aber hey, ich starte jede Quelldatei mit,
package com.yourpackage;
damit du nicht den gesamten Code in deinem Paket kontrollierst! Nun ja, aber a) das solltest du eigentlich nicht tun und b) es kann durch Versiegeln der Verpackungen verhindert werden .quelle
Sie sollten Ihre Klasse in ein eigenes Paket einfügen und das Mitglied (Instanzvariable oder Methode) als geschützt markieren. Auf diese Weise können keine anderen Klassen außer den Unterklassen auf das Mitglied zugreifen, das Sie als geschützt vermarkten. Sie erhalten eine Klasse in einem Paket, wenn Sie nur möchten, dass nur Unterklassen auf dieses geschützte Mitglied zugreifen.
quelle