Em Java, existem regras claras sobre quando utilizar cada um dos modificadores de acesso, nomeadamente o padrão (pacote privado), "público", "protegido" e "privado", enquanto se faz "classe" e "interface" e se lida com a herança?
O tutorial oficial pode ser de alguma utilidade para si.
______________________________________________________________ | │ Classe │ Pacote │ Subclasse │ Subclasse │ Mundo | | │ │ │ │(mesmo pkg)│(diff pkg)│ | |───────────┼───────┼─────────┼──────────┼──────────┼────────| |public │ + │ + │ + │ + │ + │ + | |───────────┼───────┼─────────┼──────────┼──────────┼────────| |protegido │ + │ + │ + │ + │ + │ | |───────────┼───────┼─────────┼──────────┼──────────┼────────| |no modifier│ + │ + │ + │ + │ | |───────────┼───────┼─────────┼──────────┼──────────┼────────| |private │ + │ │ │ │ │ │ | |___________|_______|_________|__________|__________|________| + : acessível em branco : não acessível
Regra fácil. Comece por declarar tudo em privado. E depois avançar para o público à medida que as necessidades surgem e o design o garante.
Ao expor os membros, pergunte-se se você está expondo escolhas de representação ou de abstração. A primeira é algo que você quer evitar, pois irá introduzir demasiadas dependências na representação real em vez de no seu comportamento observável.
Como regra geral, eu tento evitar a sobreposição de implementações de métodos por subclassificação; é muito fácil estragar a lógica. Declare métodos abstratos protegidos se você pretende que ele seja sobreposto.
Além disso, use a anotação @Override quando substituir para evitar que as coisas se partam quando você refactor.