class Person
{
private BankAccount account;
Person(BankAccount account)
{
this.account = account;
}
public Person someMethod(Person person)
{
//Why accessing private field is possible?
BankAccount a = person.account;
}
}
Bitte vergessen Sie das Design. Ich weiß, dass OOP angibt, dass private Objekte für die Klasse privat sind. Meine Frage ist, warum OOP so konzipiert wurde, dass private Felder Zugriff auf Klassenebene und keinen Zugriff auf Objektebene haben .
someMethod
ist nicht gültig. Es gibt nichts zurück. Es muss seinvoid
.Antworten:
Ich bin auch ein bisschen neugierig auf die Antwort.
Die befriedigendste Antwort, die ich finde, stammt von Artemix in einem anderen Beitrag hier (ich benenne die Klasse AClass in Person um): Warum haben Zugriffsmodifikatoren auf Klassenebene anstelle von Objekten auf Objektebene?
EDIT: Bitte stimmen Sie die Antwort von Artemix ab. Ich füge es nur ein.
quelle
Person
in der Klasse zugreiftPerson
, muss nicht die Implementierung der gesamten Klasse kennen. Die bewährte Methode besteht darin, den Accessor zu verwenden, ohne wissen zu müssen, welche Vorgänge der Accessor ausführt.equals(Object)
Methode in einer Java-Klasse implementieren , um die Gleichheit einesPerson
Objekts mit einer anderen Instanz von zu überprüfenPerson
. Möglicherweise möchten Sie der Außenwelt ermöglichen, zu überprüfen, ob die beiden Instanzen gleich sind, aber Sie möchten möglicherweise nicht alle privaten Felder der Klasse verfügbar machen, die zum Überprüfen der Gleichheit mit der Außenwelt mithilfe öffentlicher Zugriffsmethoden erforderlich sind. Der Zugriff aufprivate
Felder auf Klassenebene ermöglicht die Implementierung einer solchen Methode, ohne dass die Notwendigkeit besteht, solche öffentlichen Methoden zu implementieren.equals
).equals
kann jedoch durch Aufrufen privater Accessoren erfolgen.private
muss Zugriff auf Klassenebene gewähren. Ich stimme zu, dass die Verwendung von Accessoren im Allgemeinen eine gute Angewohnheit ist, obwohl es in diesem Fall hauptsächlich um den Kontext und den persönlichen Stil geht. Beachten Sie, dass sowohl Joshua Bloch in Effective Java (Punkt 8) als auch Tal Cohen in diesem Artikel von Dr. Dobbs direkt auf private Felder in ihren Codelisten zugreifen, wenn sie über die Implementierung sprechenequals
.Siehe die Java-Sprachspezifikation, Abschnitt 6.6.1. Zugänglichkeit bestimmen
Es sagt aus
Klicken Sie auf den Link oben, um weitere Informationen zu erhalten. Die Antwort lautet also: Weil James Gosling und die anderen Autoren von Java beschlossen haben, dass dies so ist.
quelle
Gute Frage. Es scheint, dass der Zugriffsmodifikator auf Objektebene das Kapselungsprinzip noch weiter durchsetzen würde.
Aber eigentlich ist es umgekehrt. Nehmen wir ein Beispiel. Angenommen, Sie möchten ein Objekt in einem Konstruktor tief kopieren, wenn Sie nicht auf die privaten Mitglieder dieses Objekts zugreifen können. Dann besteht die einzig mögliche Möglichkeit darin, allen privaten Mitgliedern einige öffentliche Accessoren hinzuzufügen. Dadurch werden Ihre Objekte für alle anderen Teile des Systems nackt .
Kapselung bedeutet also nicht, für den Rest der Welt geschlossen zu sein. Es bedeutet, selektiv zu sein, für wen Sie offen sein möchten.
quelle
o.deepCopy()
oder was auch immer.Dies funktioniert, weil Sie sich in der
class Person
Klasse befinden. Eine Klasse darf in ihren eigenen Klassentyp stecken. Dies ist sehr hilfreich, wenn Sie einen Kopierkonstruktor schreiben möchten, zum Beispiel:Oder wenn wir schreiben wollen
operator+
undoperator-
für unsere große Zahlenklasse.quelle
Nur meine 2 Cent auf die Frage, warum die Semantik der privaten Sichtbarkeit in Java eher auf Klassenebene als auf Objektebene ist.
Ich würde sagen, dass Bequemlichkeit hier der Schlüssel zu sein scheint. Tatsächlich hätte eine private Sichtbarkeit auf Objektebene in dem vom OP dargestellten Szenario gezwungen, Methoden anderen Klassen (z. B. im selben Paket) auszusetzen.
In Wahrheit konnte ich weder ein Beispiel finden, das zeigt, dass die Sichtbarkeit auf klassenprivater Ebene (wie sie von Java angeboten wird) im Vergleich zur Sichtbarkeit auf objektprivater Ebene Probleme verursacht.
Programmiersprachen mit einem feinkörnigeren System von Sichtbarkeitsrichtlinien können jedoch sowohl Objektsichtbarkeit auf Objektebene als auch auf Klassenebene bieten.
Zum Beispiel bietet Eiffel einen selektiven Export: Sie können jedes Klassenfeature in eine beliebige Klasse Ihrer Wahl exportieren, von {NONE} (objektprivat) über {ANY} (das Äquivalent von public und auch die Standardeinstellung) bis {PERSON} (klassenprivat, siehe Beispiel des OP) für bestimmte Klassengruppen {PERSON, BANK}.
Es ist auch interessant zu bemerken, dass Sie in Eiffel kein Attribut privat machen und keinen Getter schreiben müssen, um zu verhindern, dass andere Klassen ihm zuweisen. Öffentliche Attribute in Eiffel sind standardmäßig im schreibgeschützten Modus verfügbar, sodass Sie keinen Getter benötigen, um ihren Wert zurückzugeben.
Natürlich benötigen Sie noch einen Setter, um ein Attribut festzulegen, aber Sie können es ausblenden, indem Sie es als "Zuweiser" für dieses Attribut definieren. Auf diese Weise können Sie auf Wunsch den bequemeren Zuweisungsoperator anstelle des Setter-Aufrufs verwenden.
quelle
Da der
private
Zugriffsmodifikator ihn nur innerhalb der Klasse sichtbar macht . Diese Methode ist noch in der Klasse .quelle
Auf das
private
Feld kann in der Klasse / dem Objekt zugegriffen werden, in der das Feld deklariert ist. Es ist für andere Klassen / Objekte außerhalb der Klasse, in der es sich befindet, privat.quelle
Mit Reflection Concept in Java ist es möglich, Felder und Methoden privat zu ändern
Modificando metodos y campos privados con Refleccion en Java
quelle
Das erste, was wir hier verstehen müssen, ist, dass wir nur den oops-Prinzipien folgen müssen, damit die Kapselung besagt, dass Daten innerhalb eines Pakets (dh einer Klasse) verpackt werden und dann alle Daten als Objekt dargestellt werden und leicht zugänglich sind. Wenn wir also das Feld als nicht privat festlegen, wird nicht einzeln darauf zugegriffen. und es führt zu schlechter Paratice.
quelle