Una delle prime cose che faccio quando eseguo una sottoclasse di una classe è quella di cambiare un gruppo di metodi privati in protetti
Alcuni ragionamenti sui metodiprivate
vs .:protected
private
i metodi impediscono il riutilizzo del codice. Una sottoclasse non può utilizzare il codice nel metodo privato e potrebbe essere necessario implementarlo di nuovo - o implementare nuovamente i metodi che originariamente dipendono dal metodo privato ecc.
D'altra parte, qualsiasi metodo che non è private
può essere visto come un'API fornita dalla classe al "mondo esterno", nel senso che anche le sottoclassi di terze parti sono considerate "mondo esterno", come suggerito da qualcun altro nella sua risposta già.
È una brutta cosa? - Io non la penso così.
Naturalmente, un'API pubblica (pseudo-) blocca il programmatore originale e impedisce il refactoring di quelle interfacce. Ma visto il contrario, perché un programmatore non dovrebbe progettare i propri "dettagli di implementazione" in modo pulito e stabile come la sua API pubblica? Dovrebbe usare in private
modo da poter essere sciatto sulla strutturazione del suo codice "privato"? Pensando forse che avrebbe potuto ripulirlo più tardi, perché nessuno se ne accorgerà? - No.
Il programmatore dovrebbe anche riflettere un po 'sul suo codice "privato", per strutturarlo in modo da consentire o addirittura promuovere il riutilizzo di quanto più possibile in primo luogo. Quindi le parti non private potrebbero non diventare tanto un peso in futuro quanto un po 'di paura.
Un sacco di codice (quadro) che vedo adotta un uso incoerente di private
: protected
si trovano comunemente metodi non finali che fanno a malapena qualcosa di più che delegare a un metodo privato. protected
, metodi non definitivi il cui contratto può essere adempiuto solo attraverso l'accesso diretto a settori privati.
Questi metodi non possono essere logicamente sovrascritti / migliorati, sebbene tecnicamente non ci sia nulla per renderlo ovvio (compilatore).
Vuoi estendibilità ed eredità? Non fare i tuoi metodi private
.
Non vuoi che alcuni comportamenti della tua classe vengano modificati? Crea i tuoi metodi final
.
Davvero non può essere chiamato il tuo metodo al di fuori di un determinato contesto ben definito? Rendi il tuo metodo private
e / o pensa a come rendere il contesto ben definito richiesto disponibile per il riutilizzo attraverso un altro protected
metodo wrapper.
Ecco perché sostengo di usare private
con parsimonia. E di non confondere private
con final
. - Se l'implementazione di un metodo è vitale per il contratto generale della classe e quindi non deve essere sostituita / ignorata, fallo final
!
Per i campi, private
non è proprio male. Fintanto che i campi possono essere ragionevolmente "usati" con metodi appropriati ( no getXX()
o nosetXX()
!).