Uma das primeiras coisas que faço ao subclassificar uma classe é alterar vários métodos particulares para protegidos
Alguns argumentos sobre private
vs. protected
métodos :
private
métodos evitam a reutilização de código. Uma subclasse não pode usar o código no método privado e pode ter que implementá-lo novamente - ou reimplementar o (s) método (s) que originalmente dependem do método privado & c.
Por outro lado, qualquer método que não private
seja pode ser visto como uma API fornecida pela classe ao "mundo exterior", no sentido de que subclasses de terceiros também são consideradas "mundo exterior", como alguém sugeriu em sua resposta já.
Isso é uma coisa ruim? - Acho que não.
Obviamente, uma API pública (pseudo-) bloqueia o programador original e dificulta a refatoração dessas interfaces. Mas, visto o contrário, por que um programador não deve projetar seus próprios "detalhes de implementação" de maneira tão limpa e estável quanto sua API pública? Ele deveria usar private
para que ele possa ser desleixado ao estruturar seu código "privado"? Pensando que talvez ele pudesse limpá-lo mais tarde, porque ninguém notará? - Não.
O programador também deve pensar um pouco em seu código "privado", para estruturá-lo de uma maneira que permita ou promova a reutilização do máximo possível em primeiro lugar. Então, as partes não-privadas podem não se tornar tão onerosas no futuro quanto alguns temem.
Um monte de código (framework) Vejo adota o uso inconsistente de private
: protected
, métodos não-finais, que quase não fazem nada mais do que delegar a um método particular é comumente encontrado. protected
, métodos não finais, cujo contrato só pode ser cumprido através do acesso direto a campos particulares também.
Esses métodos não podem ser substituídos / aprimorados logicamente, embora tecnicamente não exista nada para tornar isso (compilador) óbvio.
Quer extensão e herança? Não faça seus métodos private
.
Não quer que certos comportamentos da sua classe sejam alterados? Faça seus métodos final
.
Realmente não pode ter seu método chamado fora de um determinado contexto bem definido? Torne seu método private
e / ou pense em como você pode disponibilizar o contexto bem definido necessário para reutilização através de outro protected
método de wrapper.
É por isso que eu advogo a usar private
com moderação. E para não confundir private
com final
. - Se a implementação de um método é vital para o contrato geral da classe e, portanto, não deve ser substituída / substituída, faça-o final
!
Para campos, private
não é realmente ruim. Contanto que os campos possam ser razoavelmente "usados" através de métodos apropriados (isso não é getXX()
ou setXX()
!).