Minha experiência com Java é de mais ou menos dois anos...
Mas só a poucos dias, aprendi o que o modificador de acesso protected faz... eu só utilizava private e public e tinha uma conceito errado sobre o protected.
Membros com protected podem ser acessados por classes filhas e para classes do mesmo pacote.
A questão é: Mas por que classes do mesmo pacote?
Alguém vê alguma utilidade real do protected?
Sim, e a mais logica: quando voce tem algum metodo que possa ser usado apenas pelas classes filhas, mesmo quando as mesmas encontram-se em diferentes pacotes, o que nao pode ser feito com membros “default” (sem public, private ou protected).
Concordo plenamente com isso! Essa é a utilidade do protected!
Mas o que eu não consigo entender é porque que as classes do mesmo pacote podem acessar esses membros (por exemplo atributos) diretamente...
Para métodos, tudo bem.. consegui imaginar uma situação útil! Mas para atributos não!
Um atributo protected de uma classe pode ser acessado diretamente por qualquer classe do pacote!
[quote=Lucas Castro]
Para métodos, tudo bem… consegui imaginar uma situação útil! Mas para atributos não!
Lucas[/quote]
Se voce aceita o fato de um metodo protected poder ser acessao nessa situacao, pq deveria haver diferenca para membros, ja que o modificador eh o mesmo? Ate entendo o seu ponto de vista, mas seria um tanto bizarro caso fosse diferente
Eu só estou querendo imaginar porque o Java permite que classes do mesmo pacote podem acessar membros protected... deve ter algum motivo!
No meu ver, protected só deveria ser acessado diretamente pelas sub-classes...
Acho que isso quebra o encapsulamento! Protected é mais acessível que o package !!
Eu não consigo concordar com isso!!
Está me entendento??
protected, por permitir que subclasses, mesmo estando em outros pacotes, acessem os membros, eh mais visivel que default. E, seguindo a logica, o membro mais visivel herda as caracteristicas do membro menos visivel.
Basicamente eh isso. Ou seja: protected eh mais visivel que default (logo, outras classes no mesmo pacote podem acessar), mas eh menos visivel que o public (classes que nao herdem, em outros pacotes, nao podem acessar)
Mas eu acho que o Java deveria ser assim:
private < protected < default < public
e que membros protected só poderiam ser acessados diretamente pelas sub-classes! e não pelas classes do pacote também!!
[quote=Lucas Castro]
Mas eu acho que o Java deveria ser assim:
private < protected < default < public
Lucas[/quote]
Eu podia jurar que era assim. Digo mais: acho que me ensinaram assim. :shock:
Se não me engano esse é o padrão no Delphi. Sempre pus protected achando que só as subclasses iriam ver o atributo! :? Desde que li este post já reescrevi um bocado de código. :lol:
Quando voce tem algo com o modificador default, somente classes do mesmo pacote poderao acessar os membros. Logo, se voce tiver
package a;
public class Pai {
void fazFilinhos() { }
}
e
package b;
public class SuperPai extends a.Pai {
public void maisFilhos() {
super.fazFilhinhos();
}
}
o seu programa nao ira compilar, ja que fazFilhinhos() eh restrito ao package “a”. Para resolver esse tipo de problema, foi criado o protetected, com as caracteristicas que todos conhecemos.
Assim, protected eh uma versao “melhorada” de default, e, portanto, herda suas caracteristicas, o que inclui acesso a classes do mesmo pacote.
Nos primeiros betas do Java havia o “private protected”, que fazia isso que voces querem, contudo, tal possibildade de combinacao de modificadores foi removida da linguagem.
Ok Rafael. Entendi o porque do protected ser assim. Mas concordo com o lucas e o jprogramer que também deveria existir um modificador que desse acesso somente as subclasses. Normalmente me deparo mais com situações onde um atributo deveria ser acessado somente pelas subclasses do que todas em um pacote. É bem verdade que, na maioria, usando gets/sets nas filhas o resultado é mesmo, talvez por isso também tenhan tirado o private protected como você disse.
[quote=Lucas Castro]
Sendo o protected como é, acho que nunca vou definir um membro como protected…
Se eu definir como protected, pode algum “gaiato” pôr uma classe no meu pacote pra acessar esse membro pra fazer alguma besteira…
[/quote]
Você pode fazer sua classe como quiser Lucas, e sempre vai haver de se chamar métodos ou acessar atributos que não deveriam ser acessados. Mesmo se for private, dá pra acessar.
Fora que, se você se plugar no mecanismo de carregamento de classes por definir seu ClassLoader ou um agente do J2SE 5, nem permissão de segurança impede o sujeito de fazer isso.
Em tudo na vida, é melhor saber do que não saber. Mas sempre tem que se saber com o que se preocupar E isso não é algo que deva tirar seu sono não.
Não, não é não. É o que você precisa saber quando não querem crackear teu código. Agora, existe a parte que você tem que saber quando querem…
De forma alguma. Os modificadores de visibilidade foram feitos para prevenir usos naturais mas não planejados de algo. Existem maneiras não naturais de acessar, só isso.
Bleleza Mister_M!
Obrigado pela ajuda... eu tava viajando demais... :D não dá pra se pensar em segurança a nível desses modificadores!
Obrigado também ao Rafael e aos demais amigos pelos esclarecimentos!!!
Voltando à discussão inicial...
Alguém pode citar um exemplo que o ideal seja usar o modificador protected!?
Lucas… ainda precisa? entao la vai: use protected quando voce quiser permitir o acesso a membros a subclasses, mas nao ao resto do mundo. Simples assim.