Protected x Default

10 respostas
C

Olá Pessoal, sou bem iniciante em java, estou lendo o livro da katy sierra e fiquei com uma dúvida: Qual a lógica de membros de uma classe com o modificador protected só terem sub-classes no pacote porém podem ser herdados em outros pacotes ?

Desde já, grata.

10 Respostas

dfsilva86

Os membros protected somente estarão disponíveis para outras classes por meio da herança, tanto fora como dentro do pacote.

Membros Default são de nível de pacote.

tnaires

dfsilva86:
Os membros protected somente estarão disponíveis para outras classes por meio da herança, tanto fora como dentro do pacote.

Membros Default são de nível de pacote.


Não. Membros protected estão disponíveis tanto para classes do mesmo pacote quanto para subclasses.

dfsilva86

tnaires wrote:
Não. Membros protected estão disponíveis tanto para classes do mesmo pacote quanto para subclasses.

Obrigado pela correção!

C

Mas qual seria porque disso. Em termos de modelagem porque existe essa regra ?

adriano_si

Do que você está precisando Claudia ?? Pense comigo… porque eu iria querer uma classe onde seus membros só podem ser acessados por quem o herde ou estejam no mesmo pacote. ??

Eu desenvolvo minha aplicação aqui em casa que vc, por algum motivo pessoal… quer usar… afinal, você gostou da minha idéia inicial… O problema é que eu fiz só a idéia inicial… vc quer mais coisas vc quer ampliar meu universo… vc precisa usar minha classe como se os membros dela fizessem parte de sua classe que vc vai extender… logo os membros de minha classe precisam estar protegidos pra que vc possa herdá-los… não quero apenas lhe disponibilizar acessos a eles por getters e setters… quero que a sua classe possuam os atributos que ei criei… sacou ?? Se não… vou tentar exemplificar, apesar da preguiça…

adriano_si

Um exemplo que fiz agora:

package br.com.guj.exemploheranca;

public abstract class Pessoa {

    protected String nome;
    protected String endereco;
    protected int idade;

    protected abstract void seApresentar();

}

Essa classe só declara os atributos de Pessoa…

agora tem essa:

package br.com.guj.exemploheranca;

public class Adriano extends Pessoa {

    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEndereco() {
        return this.endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public int getIdade() {
        return this.idade;
    }

    public void setIdade(int idade) {
        this.idade = idade;
    }

    @Override
    protected void seApresentar() {
        System.out.println("Meu nome e: " + this.getNome() + ", moro em " + this.getEndereco() + ", tenho " + this.getIdade() + " anos de idade.");
    }

    public static void main(String[] args) {
        Adriano eu = new Adriano();
        eu.setNome("Adriano Ohana");
        eu.setEndereco("Belem-PA");
        eu.setIdade(26);
        eu.seApresentar();
    }

}

Perceba que na classe Adriano, pude fazer todos os métodos Get e Set como se os atributos, nome, endereço e idade fossem de minha própria classe… se vc tentar usá-los diretamente, também consegue… isso na subclasse… se vc usar alguma IDE e for brincar com esse exemplo, vai perceber que a mesma lê os atributos como se fossem da própria classe Adriano… pra treinar, faça uma classe Claudia e Teste aí pra ver no que dá…

PS: da forma que está não precisava do protected pois as classes estão no mesmo pacote… apenas finja por um momento que estão em pacotes diferentes…

Espero que tenha entendido.

Att.

rodpuc

O uso de protected n eh mto encorajado… se n tiver um bom motivo para usá-lo simplesmente não o use :wink:

adriano_si

verdade… precisa ter uma arquitetura muito bem definida e com a certeza de que precisará usar o Protected… Se houver outra maneira, use a outra maneira…

Falows :wink:

C

Entendi a necessidade e aplicação do modificador. Mas o que fiquei na dúvida é porque se existe essa regra na Linguagem, deve ter sido pensado para um propóstio eficiente.

Imagino que um profissional do nível de um arquiteto saberia na modelagem do projeto quando da necessidade dessa regra.

Agora, se realmente não existe lógica nessa idéia, seria um caracteristica da linguagem inútil ?

fantomas

Deixa eu entrar nessa?

Em orientação a objetos existem umas coisas bastante importantes como estas aqui: Abstração, ENCAPSULAMENTO, Polimorfismo e Herança.

Este recurso a que vc se refere está relacionado com a idéia de encapsulamento; como sempre, em uma linguagem OO existem várias maneiras de vc caracterizar fronteiras em suas abstrações e o protected foi feito pra ajudar nesta parte.

Dê uma lida no conteúdo deste link http://www.devx.com/tips/Tip/14713, em dado momento o atributo protect foi utilizado dentro do mesmo pacote (fronteira) porem em uma classe deferente, como estava dentro do mesmo pacote (fronteira) havia a liberdade (baseada na regra) e o programador utilizou como se fosse um atributo público; e esta maneira de escrever código a primeira vista causa arrepios porque visualmente parece que o atributo está sendo utilizado como se fosse publico (public) com liberdade máxima de acesso. Porisso acho que muitos não gostam dessa abordagem. Sem falar que o aspecto arquitetonico é sutil, ou seja uma pessoa que não está atenta a estes detalhes vai estranhar bastante este tipo de abordagem.

Acho que os fissurados em arquitetura devem gostar dessa idéia.

Espero ter ajudado.

P.S Desculpa aê se falei muita @!$#%!

flws

Criado 15 de abril de 2009
Ultima resposta 16 de abr. de 2009
Respostas 10
Participantes 6