(Vorsichtsmaßnahme: Ich bin kein Java-Programmierer, ich bin ein Perl-Programmierer. Perl hat keinen formalen Schutz, weshalb ich das Problem vielleicht so gut verstehe :))
Privat
Wie Sie denken, kann es nur die Klasse sehen, in der es deklariert ist.
Paket privat
Es kann nur von dem Paket gesehen und verwendet werden , in dem es deklariert wurde. Dies ist die Standardeinstellung in Java (was einige als Fehler ansehen).
Geschützt
Package Private + kann von Unterklassen oder Paketmitgliedern gesehen werden.
Öffentlichkeit
Jeder kann es sehen.
Sichtbar außerhalb des von mir kontrollierten Codes. (Obwohl dies keine Java-Syntax ist, ist es für diese Diskussion wichtig).
C ++ definiert eine zusätzliche Ebene namens "Freund" und je weniger Sie darüber wissen, desto besser.
Wann sollten Sie was verwenden? Die ganze Idee ist die Kapselung, um Informationen zu verbergen. So weit wie möglich möchten Sie die Details, wie etwas getan wird, vor Ihren Benutzern verbergen. Warum? Denn dann können Sie sie später ändern und den Code von niemandem beschädigen. Auf diese Weise können Sie Fehler optimieren, umgestalten, neu gestalten und beheben, ohne befürchten zu müssen, dass jemand den Code verwendet hat, den Sie gerade überarbeitet haben.
Als Faustregel gilt also, Dinge nur so sichtbar zu machen, wie sie sein müssen. Beginnen Sie mit privat und fügen Sie nur bei Bedarf mehr Sichtbarkeit hinzu. Machen Sie nur das öffentlich, was der Benutzer unbedingt wissen muss. Jedes Detail, das Sie öffentlich machen, verkrampft Ihre Fähigkeit, das System neu zu gestalten.
Wenn Sie möchten, dass Benutzer Verhaltensweisen anpassen können, anstatt Interna öffentlich zu machen, damit sie sie überschreiben können, ist es oft eine bessere Idee, diese Eingeweide in ein Objekt zu schieben und diese Schnittstelle öffentlich zu machen. Auf diese Weise können sie einfach ein neues Objekt einstecken. Wenn Sie beispielsweise einen CD-Player schreiben und möchten, dass das Bit "Informationen zu dieser CD suchen" anpassbar ist, anstatt diese Methoden öffentlich zu machen, würden Sie all diese Funktionen in ein eigenes Objekt einfügen und nur Ihren Objekt-Getter / Setter öffentlich machen . Auf diese Weise fördert das geizige Freilegen Ihrer Eingeweide eine gute Zusammensetzung und Trennung von Bedenken
Persönlich bleibe ich nur bei "privat" und "öffentlich". Viele OO-Sprachen haben genau das. "Geschützt" kann praktisch sein, aber es ist wirklich ein Betrug. Sobald eine Schnittstelle mehr als privat ist, liegt sie außerhalb Ihrer Kontrolle und Sie müssen im Code anderer Personen nach Verwendungsmöglichkeiten suchen.
Hier kommt die Idee von "veröffentlicht" ins Spiel. Um eine Schnittstelle zu ändern (umzugestalten), müssen Sie den gesamten Code finden, der sie verwendet, und dies auch ändern. Wenn die Schnittstelle privat ist, ist das kein Problem. Wenn es geschützt ist, müssen Sie alle Ihre Unterklassen suchen. Wenn es öffentlich ist, müssen Sie den gesamten Code suchen, der Ihren Code verwendet. Manchmal ist dies beispielsweise möglich, wenn Sie an Unternehmenscode arbeiten, der nur für den internen Gebrauch bestimmt ist. Dabei spielt es keine Rolle, ob eine Schnittstelle öffentlich ist. Sie können den gesamten Code aus dem Unternehmens-Repository abrufen. Wenn jedoch eine Schnittstelle "veröffentlicht" wird und Code außerhalb Ihrer Kontrolle verwendet wird, werden Sie abgespritzt. Sie müssen diese Schnittstelle unterstützen oder riskieren, Code zu brechen. Sogar geschützte Schnittstellen können als veröffentlicht betrachtet werden (weshalb ich nicht '
Viele Sprachen empfinden den hierarchischen Charakter von öffentlich / geschützt / privat als zu einschränkend und nicht im Einklang mit der Realität. Zu diesem Zweck gibt es das Konzept einer Merkmalsklasse , aber das ist eine andere Show.
private
versteckt sich vor anderen Klassen im Paket.public
stellt Klassen außerhalb des Pakets zur Verfügung.protected
ist eine Version vonpublic
nur auf Unterklassen beschränkt.