Una de las primeras cosas que hago cuando subclasifico una clase es cambiar un montón de métodos privados a protegidos
Algunos razonamiento sobre private
vs. protected
métodos :
private
Los métodos evitan la reutilización del código. Una subclase no puede usar el código en el método privado y puede que tenga que implementarlo nuevamente, o volver a implementar los métodos que originalmente dependen del método privado & c.
Por otro lado, cualquier método que no private
se puede ver como una API proporcionada por la clase al "mundo exterior", en el sentido de que las subclases de terceros también se consideran "mundo exterior", como sugirió otra persona en su respuesta ya.
¿Es eso algo malo? No lo creo.
Por supuesto, una API (pseudo) pública bloquea el programador original y dificulta la refactorización de esas interfaces. Pero visto al revés, ¿por qué un programador no debería diseñar sus propios "detalles de implementación" de una manera tan limpia y estable como su API pública? ¿Debería usarlo private
para ser descuidado sobre la estructuración de su código "privado"? ¿Pensando que tal vez podría limpiarlo más tarde, porque nadie se dará cuenta? - No.
El programador también debe pensar un poco en su código "privado", para estructurarlo de una manera que permita o incluso promueva la reutilización de la mayor cantidad posible en primer lugar. Entonces, las partes no privadas pueden no convertirse en una carga tan pesada en el futuro como algunos temen.
Veo una gran cantidad de código (marco) que adopta un uso inconsistente de private
: protected
métodos comunes que no hacen nada más que delegar a un método privado. protected
, métodos no finales cuyo contrato solo se puede cumplir a través del acceso directo a campos privados también.
Estos métodos no pueden ser anulados / mejorados lógicamente, aunque técnicamente no hay nada allí para hacer que eso (compilador) sea obvio.
¿Quieres extensibilidad y herencia? No hagas tus métodos private
.
¿No quieres alterar cierto comportamiento de tu clase? Haz tus métodos final
.
¿Realmente no se puede invocar su método fuera de un contexto determinado y bien definido? Haga su método private
y / o piense cómo puede hacer que el contexto bien definido requerido esté disponible para su reutilización a través de otro protected
método de contenedor.
Es por eso que recomiendo usar con private
moderación. Y no confundir private
con final
. - Si la implementación de un método es vital para el contrato general de la clase y, por lo tanto, no debe reemplazarse / anularse, ¡hágalo final
!
Para los campos, private
no es realmente malo. Siempre y cuando el (los) campo (s) se puedan "usar" razonablemente a través de métodos apropiados (¡eso no es getXX()
o setXX()
!).