Wie von anderen angegeben, sind private Variablen gut, um Missbrauch zu vermeiden, der das Objekt in einen inkonsistenten Status versetzt und es schwierig macht, Fehler und unvorhergesehene Ausnahmen zu verfolgen.
Auf der anderen Seite geht es jedoch meistens um geschützte Felder, die von den anderen ignoriert wurden.
Eine erweiterte Unterklasse hat uneingeschränkten Zugriff auf geschützte Felder, wodurch das Objekt so fragil wird, als ob solche Felder öffentlich wären. Diese Fragilität ist jedoch auf die erweiterte Klasse selbst beschränkt (es sei denn, sie macht solche Felder noch stärker verfügbar).
Öffentliche Felder sind daher schwer als gut einzustufen, und bis jetzt werden sie nur für Klassen verwendet, die als Konfigurationsparameter verwendet werden (eine sehr einfache Klasse mit vielen Feldern und keiner Logik, sodass diese Klasse nur als Parameter an übergeben wird eine Methode).
Andererseits verringern private Felder die Flexibilität Ihres Codes für andere Benutzer.
Flexibilität vs. Probleme, Vor- und Nachteile:
Objekte, die von Ihrem Code in der Vanilla-Klasse mit geschützten Feldern instanziiert wurden, sind sicher und liegen in Ihrer alleinigen Verantwortung.
Objekte, die Ihre Klasse mit geschützten Feldern erweitern, die von den Benutzern Ihres Codes instanziiert werden, liegen in ihrer Verantwortung und nicht in Ihrer.
Wenn also geschützte Felder / Methoden nicht gut dokumentiert sind oder die Benutzer nicht wirklich verstehen, wie solche Felder und Methoden verwendet werden sollten, haben sie eine gute Chance, sich und Ihnen unnötige Probleme zu bereiten.
Wenn Sie jedoch die meisten Dinge privat machen, wird die Flexibilität der Benutzer eingeschränkt, und sie werden möglicherweise sogar auf der Suche nach Alternativen sein, da sie möglicherweise keine Abzweigung erstellen und warten möchten, damit die Dinge auf ihre Weise geschehen.
Entscheidend ist also ein ausgewogenes Verhältnis zwischen privat, geschützt und öffentlich.
Jetzt ist die Entscheidung zwischen privat und geschützt das eigentliche Problem.
Wann geschützte verwenden?
Jedes Mal, wenn Sie verstehen, dass ein Feld sehr flexibel sein kann, sollte es als geschützt codiert werden. Diese Flexibilität ist: von Null werden (wobei Null immer geprüft und als gültiger Zustand erkannt wird, der keine Ausnahmen auslöst) bis zu Einschränkungen, bevor sie von Ihrer Klasse ex verwendet werden. > = 0, <100 usw. und automatisch für über- / untergelaufene Werte festgelegt, wobei höchstens eine Warnmeldung ausgegeben wird.
Für ein solches geschütztes Feld könnten Sie also einen Getter erstellen und nur diesen verwenden (anstatt die Feldvariable direkt zu verwenden), während andere Benutzer ihn möglicherweise nicht verwenden, falls sie mehr Flexibilität für ihren spezifischen Code wünschen, wie in meinem Beispiel : wenn sie wollen, dass negative Werte in ihrer erweiterten Klasse gut funktionieren.