Em Java, existem quatro modificadores de acesso disponíveis para métodos:
public
- qualquer classe pode usar esse método.
protected
- classes no mesmo pacote e subclasses em qualquer pacote podem usar esse método.
private
- somente essa classe pode usar esse método.
no modifier
("pacote privado") - somente classes no mesmo pacote podem usar esse método.
O que acontece com frequência é que eu quero ter métodos úteis em uma superclasse, que todas as subclasses possam usar. Mas não faria sentido para outras classes acessar esse método e, em certo sentido, quebraria o encapsulamento.
Portanto, tenho que declarar esses métodos úteis na superclasse public
ou protected
, que os expõe a todas as outras classes, pelo menos no pacote. Mesmo que sejam apenas para serem usadas pelas subclasses.
Existe uma razão pela qual não há um subclasses-only
modificador de acesso em Java? Parece muito estranho para mim. Estou esquecendo de algo?
Além disso, um subclasses-only
modificador de acesso também seria útil para quando você deseja expor variáveis apenas para subclasses. O que para mim acontece muito.
fonte
O Java originalmente tinha esse modificador. Foi escrito,
private protected
mas removido no Java 1.0.Suponho que foi um julgamento que a complexidade extra não valia o custo.
Todo recurso de idioma tem um custo: ensiná-lo a novos programadores; na documentação; na implementação nas ferramentas do compilador, JVM e dev; no raciocínio sobre a correção do programa; em restringir a evolução futura da linguagem; e mais. Os recursos de linguagem interagem entre si, potencialmente com as interações de N 2 .
Qual a porcentagem de programadores Java que leram as especificações de linguagem Java e de VM? Aposto que é uma pequena porcentagem, que defende uma linguagem ainda mais simples em prol da compreensibilidade e dos produtos de engenharia dos quais podemos confiar
O benefício do
private protected
recurso foi pequeno, pois o pacote é a principal unidade de modularidade.fonte
O controle de acesso pode ser pensado como resultado de uma cobertura com um desenvolvedor imaginário que está trabalhando com sua classe sobre os métodos e as propriedades da classe ...
Isso é público ...
Isso é privado ...
Isso está protegido ...
Este é o pacote.
Isso é protegido ...
fonte
Isso já existe. Está protegido.
Você tem controle sobre quais classes existem dentro do pacote. Se não houver outra classe no pacote e uma determinada variável ou método estiver protegido, serão 'apenas subclasses'.
Dito isto, mais uma vez, você tem controle sobre quais classes existem dentro do pacote. Você pode optar por não usar os métodos ou variáveis protegidas.
fonte