[RESOLVIDO] Encapsulamento?

10 respostas
gpd38

Em java, quando eu falo sobre encapsulamento. O que devo saber? Onde aplicar? Exs!

10 Respostas

shoko

Cada classe deve ter suas respectivas responsabilidades e manipular os atributos pertinentes a mesma sem que outras regras ou outras classes possam acessar alterando diretamente os mesmos, a alteracao ou obtenção de atributos deve ser feita através de métodos e não acessando diretamente os atributos do objeto.

Achei essa explicação em um site e achei interessante.

Encapsulamento é o fato de o estado do seu objeto poder ser modificado apenas através de alterações no seu comportamento, ou seja, seus serviços.

um bean é um exemplo básico de encapsulamento aonde você só pode acessar os atributos através de métodos pertinentes a ele.

tem bastante coisa sobre encapsulamento na internet.

gpd38

Posso dizer que um exemplo de encapsulamento seria uma interface ou nao tem nada haver?

class interface NomeA{

public metodo x();

public metodo y();

public metodo z();

public metodo w();

}

class implementacoes{

public metodo x(){

. . .

. . .

. . .

}
public metodo y(){

. . .

. . .

. . .

}
public metodo z(){

. . .

. . .

. . .

}
public metodo w(){

. . .

. . .

. . .

}

}

shoko

na verdade interface não é um exemplo de encapsulamento, interface é um tipo de contrato da classe, é para se obter polimorfismo entre outros beneficios depois.

um exemplo de encapsulamente são as classes Bean que nada mais são que atributos privados com seus respectivos getters e setters.

Aqui embaixo é um exemplo de uma classe Bean que tem seus atributos encapsulados, isso é, somente é possivel acessar o nome através dos métodos não podemos, em hipotese alguma, mudar o valor do nome ou resgatar esse valor diretamente.
class ExemploBean {
        private String nome;

        public void setNome(String nome){
                    this.nome = nome
              }      
        public String getNome(){
                    return this.nome;
              }
}
class testBean(){
     public static void main(String[] args){
            ExemploBean bean = new ExemploBean();

                   
            bean.nome = "teste";// código não compila pois o atributo nome está encapsulado então não acessamos ele diretamente

            System.out.println(bean.nome);	// tambem não compila
                      
            
            bean.setNome("teste");// agora o código compila
            /* compila pois estamos acessando o atributo nome atraves de 
             * um método e nao diretamente
             */
            System.out.println(bean.getNome());
                    
         }
}

espero ter ajudado, qualquer coisa estamos aqui.

pcalcado

shoko:
Cada classe deve ter suas respectivas responsabilidades e manipular os atributos pertinentes a mesma sem que outras regras ou outras classes possam acessar alterando diretamente os mesmos, a alteracao ou obtenção de atributos deve ser feita através de métodos e não acessando diretamente os atributos do objeto.

Boa explicação mas não basta apenas usar métodos, é preciso fazer com que eles não exponham a implementação.

Comportamento não é alterado. Acho que o que o autor quis dizer que o estado é alterado através do comportamento do objeto. Ainda assim fica estranho mas pelo menos fica mais próximo do sentido, creio.

(ok, ele é alterado por metaprogramação ou algo como strategy, não é alterado neste contexto)

Isso não é verdade. Get/Set (se você considera que um bean é algo com get/set apenas e não um javabean de verdade) não garantem encapsulamento.

rodrigoK

shoko:
um exemplo de encapsulamente são as classes Bean que nada mais são que atributos privados com seus respectivos getters e setters.

Aqui embaixo é um exemplo de uma classe Bean que tem seus atributos encapsulados, isso é, somente é possivel acessar o nome através dos métodos não podemos, em hipotese alguma, mudar o valor do nome ou resgatar esse valor diretamente.

class ExemploBean {
        private String nome;

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

Esse exemplo de Bean, não seria simplesmente um forma mais “complicada” ou “camuflada” de dizer que sua String nome é public?
Não entra na questão de objetos fantoches, ou viajei?

Abraços,

D

A resposta do shoko está corretisima.

“Encapsulamento é um princípio que propõe ocultar determinados elementos de uma classe das demais classes.
Ao colocar uma proteção ao redor dos atributos e criar métodos para prover o acesso a estes, desta forma estaremos prevenindo contra os efeitos colaterais indesejados que podem afetá-los ao ter essas propriedades modificadas de forma inesperada.
Podemos prevenir o acesso aos dados dos nossos objetos declarando que temos controle desse acesso.

abs,

LPJava

outro ponto importante é:

Alta coesao e o baixo acomplamento, ou seja,

coesao: refere-se a definicao, o objetivo de sua class se ela está focada naquele objetivo proposto a ela

acomplamento: refere-se o quanto ela conhece de outra classe…

ex.:

Vamos dizier que vc tem uma classe chamada class CadNome ai essa classe ela faz coisas demais, alem do que deveria (apenas cadastrar nomes). Ela gera relatorio dos nomes, ela faz consulta… ai vc tem uma classe bom baixa coesao.

E acomplamento o desejavel é o baixo, porem eh comum ver programadores inexperientes desenvolver com alto acomplamento onde a classe A acessa diretamente um variavel de instancia que é de B onde o acesso deveria ser por metodos para obter um baixo acomplamento.

Bom exemplo citados sao simples, mais coesao e acomplamento é usando a todo instante.

fabim

O que eu entendo por encapsulamento:

Se eu tenho uma classe com 10 atributos, e tenho 10 get’s e 10 set’s, sendo que 4 desses atributos deveriam ser de conhecimento APENAS DA PROPRIA classe, entao ela nao esta encapsulada corretamente.

Esses 4 atributos poderiam ser private, sem get nem set. Eu abro get e set apenas pro que importa pros outros objetos (interface publica).

pcalcado

djDufu:
A resposta do shoko está corretisima.
“Encapsulamento é um princípio que propõe ocultar determinados elementos de uma classe das demais classes.
Ao colocar uma proteção ao redor dos atributos e criar métodos para prover o acesso a estes, desta forma estaremos prevenindo contra os efeitos colaterais indesejados que podem afetá-los ao ter essas propriedades modificadas de forma inesperada.
Podemos prevenir o acesso aos dados dos nossos objetos declarando que temos controle desse acesso.

Você está confundindo encapsulamento com information hiding. isso é bem comum, dá uma olhada no texto que linkei acima.

gpd38

Entao um forma de encapsulamento é isso.

Em um classe eu ter atributos onde somente aclasse acessaria, porem eu poderia alteralos com get e set.

Criado 31 de julho de 2008
Ultima resposta 3 de ago. de 2008
Respostas 10
Participantes 7