Eines der ersten Dinge, die ich mache, wenn ich eine Klasse unterklassifiziere, ist, eine Reihe privater Methoden in protected zu ändern
Einige Überlegungen zu private
vs. protected
Methoden :
private
Methoden verhindern die Wiederverwendung von Code. Eine Unterklasse kann den Code nicht in der privaten Methode verwenden und muss ihn möglicherweise erneut implementieren - oder die ursprünglich von der privaten Methode & c abhängigen Methoden erneut implementieren.
Andererseits kann jede Methode, die nicht private
als API angesehen werden kann, die von der Klasse für "die Außenwelt" bereitgestellt wird, in dem Sinne, dass Unterklassen von Drittanbietern auch als "Außenwelt" betrachtet werden, wie jemand anderes in seiner Antwort vorgeschlagen hat bereits.
Ist das etwas schlechtes? - Das glaube ich nicht.
Natürlich sperrt eine (pseudo-) öffentliche API den ursprünglichen Programmierer und behindert das Refactoring dieser Schnittstellen. Aber umgekehrt: Warum sollte ein Programmierer seine eigenen "Implementierungsdetails" nicht so sauber und stabil gestalten wie seine öffentliche API? Sollte er private
damit umgehen, um seinen "privaten" Code zu strukturieren? Denken Sie vielleicht, dass er es später aufräumen könnte, weil niemand es bemerken wird? - Nein.
Der Programmierer sollte auch ein wenig über seinen "privaten" Code nachdenken, um ihn so zu strukturieren, dass er die Wiederverwendung von so viel wie möglich überhaupt erst ermöglicht oder sogar fördert. Dann werden die nicht-privaten Teile in Zukunft möglicherweise nicht mehr so belastend wie manche befürchten.
Eine Menge (Framework-) Code, den ich sehe, verwendet uneinheitlich private
: protected
Nicht endgültige Methoden, die kaum mehr als das Delegieren an eine private Methode leisten, sind häufig anzutreffen. protected
, nicht endgültige Methoden, deren Vertrag nur durch direkten Zugang zu privaten Feldern erfüllt werden kann.
Diese Methoden können logisch nicht überschrieben / erweitert werden, obwohl technisch nichts da ist, was das (Compiler-) offensichtlich macht.
Wünschen Sie Erweiterbarkeit und Vererbung? Machen Sie nicht Ihre Methoden private
.
Willst du nicht, dass sich ein bestimmtes Verhalten deiner Klasse ändert? Machen Sie Ihre Methoden final
.
Können Sie Ihre Methode wirklich nicht außerhalb eines bestimmten, genau definierten Kontexts aufrufen lassen? Stellen Sie Ihre Methode bereit private
und / oder überlegen Sie, wie Sie den erforderlichen gut definierten Kontext für die Wiederverwendung durch eine andere protected
Wrapper-Methode verfügbar machen können .
Deshalb empfehle ich, private
sparsam zu verwenden . Und nicht zu verwechseln private
mit final
. - Wenn die Implementierung einer Methode für den allgemeinen Vertrag der Klasse von entscheidender Bedeutung ist und daher nicht ersetzt / überschrieben werden darf, machen Sie es final
!
Für Felder private
ist das nicht wirklich schlecht. Solange das / die Feld (er) mit geeigneten Methoden sinnvoll "genutzt" werden kann (das ist nicht getXX()
oder setXX()
!).