Protected nem é tão protegido

20 respostas
Lucas_Castro

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?

20 Respostas

Rafael_Steil

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).

Em http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#62587 tem uma explicacao, mas eh um tanto chato de ler.

Rafael

Lucas_Castro

Beleza Rafael!

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!

Agradeço pela atenção!
Lucas
Rafael_Steil

Lucas Castro:

Para métodos, tudo bem… consegui imaginar uma situação útil! Mas para atributos não!
Lucas

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 :stuck_out_tongue:

Rafael

Lucas_Castro

É... realmente não fui muito claro! :)

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 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??

Lucas

Rafael_Steil

Veja:

private < default < protected < public

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)

Rafael (com a ajuda do Paulo)

Lucas_Castro

Beleza Rafael! Isto está claro!

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!!

Concorda comigo?

Lucas
dsiviotti

Lucas Castro:

Mas eu acho que o Java deveria ser assim:
private < protected < default < public
Lucas

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:

Vou dar uma lida pois ainda não acreditei 100%. :smiley:

Lucas_Castro

Pois pode acreditar caro Douglas! :)

Basta conferir o tutorial da Sun.

Eu também tinha aprendido errado! Falta de atenção...
Só me restou mudar meus códigos também...

Agora eu quero saber porque que é assim! Qual o motivo!

Lucas

J

Lucas, concordo com você.
Em algumas situações precisei de algo que pudesse ser visto APENAS pelas classes filhas.

Isso é um negócio meio tosco do java.
Nunca entendi também o motivo.
Gostaria de saber também.

Rafael_Steil

Encarem dessa maneira:

protected eh um “default” com asteroides.

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.

Rafael

dsiviotti

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.

mister_m

Basta usar protected e deixar a classe sozinha no pacote. :mrgreen:

Lucas_Castro

Huahauauahua!! Boa mister_m! :smiley:

Não é o mesmo resultado Douglas!

Imagine qual seria o modificador de acesso do get e do set!! Public ou protected?


Cara, to achando isso do Java muito tosco!! :frowning:


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…


Lucas

mister_m

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…

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.

Lucas_Castro

Por favor Mister_M... não me diga isso!! :?
Isso é contra tudo o que eu entendo sobre os modificadores de acesso e encapsulamento!! :(

Se for assim... não perde toda a sua utilidade?!
Como posso acessar membros private?

Lucas

mister_m

Em tudo na vida, é melhor saber do que não saber. Mas sempre tem que se saber com o que se preocupar :slight_smile: 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… :slight_smile:

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.

Usando truques sujos de reflexão :slight_smile:

Lucas_Castro

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
Rafael_Steil

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.

Rafael

Lucas_Castro

Tá… tudo bem então…

Obrigado!


Lucas

pcalcado

Só uma dicazinha conceitual:

Modificadores de acesso não são para segurança, são apra abstração.

O objetivo em escodner um método e não fazer seus clientes se preocuparem com ele, não fazer deste um segredo inatingível.

Se seu modelo de segurança se basear em modificadores de acesso…tomara que você não trabalhe no meu banco :lol:

Criado 28 de abril de 2005
Ultima resposta 2 de mai. de 2005
Respostas 20
Participantes 6