Alguem poderia me mostrar um exemplo em que o encapsulamento é indispensável?

8 respostas
xxmayconxx

ouço muito sobre encapsulamento mas na verdade não consegui “ver a luz” digamos assim, não vejo qual a sua utilidade, não sei por que usar get e set, sei muito bem como eles funcionam mas não sei por que os atributos da classe devem ser acessados por esses métodos.Obrigado pelas respostas.

8 Respostas

Lucas_Rinaldi

Tenho um exemplo bom de classe…

class Quadrado {
    private int lado1;
    private int lado2;

    public Quadrado() {

    }

    public int getLado1() {
        return lado1;
    }

    public void setLado1(int lado1) {
        if (lado1 >= 0) {
            this.lado1 = lado1;
        } else {
            this.lado1 = 0;
        }
    }

    public int getLado2() {
        return lado2;
    }

    public void setLado2(int lado2) {
         if (lado2 >= 0) {
            this.lado2 = lado2;
        } else {
            this.lado2 = 0;
        }
    }
}

Por exemplo um quadrado nao pode ter lados negativos, se outros programadores que forem reutilizar as suas classes tiverem acesso aos seus atributos diretamente eles podem modificar sem nenhuma restrição e ai quebrar todo o esquema da sua classe.

Agora se as suas variaveis forem private eles só poderam modificar as variaveis pelos metodos set e nos métodos tu poderá colocar restrições de acordo com a sua classe.

Espero que tenha entendido, abraço!

A

Imagine…

semafaro.cor = “verde”
semafaro.cor = “amarelo”
semafaro.cor = “verde”
semafaro.cor = “vemelho”

Você pode fazer isto ??? Pode. Mas é aconselhável??? Em toda aplicação e todos desenvolvedores terão que conhecer as cores do “semáfaro”???

Isto é bom ou ruim???

E você pode do vermelho pular pro amarelo??? :frowning:

O fato de ser uma classe não quer dizer que tem que ter os famigerados set’s e get’s…

Semáfaro pode ser uma classe de domínio, ser persistida (new Semafaro(“Av.paulista, 512”, TipoDeSemafaro.CARRO)) e ter apenas “proximaCor()”, “abrir()”, “fechar()”, desta maneira quem for consumir esta classe, tem q tomar decisão com base em seus métodos.

... if(semafaroDeVeiculosDaPaulistaComConsolacao().estaFechado()) { semafaroDePedestreDaPaulistaComConsolacao().abrir(); } else { semafaroDePedestreDaPaulistaComConsolacao().fechar(); } ...
Desta maneira, vc precisa apenas conhecer como a classe se comporta, não precisa saber as String, Enums ou seja lá o que for que controla o fluxo de pedestres/carro.

Espero ter ajudado.

ViniGodoy

Recomendo fortemente a leitura desse post:

F

Encapsulamento serve para segurança… tipo… uma variável ou metodo setar/ enviar o seu valor para outra variável sozinha…
encapsulamento são essas palavras ai do exemplo acima… public, private,protected…
esse link explicará melhor veja:

http://www.tiexpert.net/programacao/java/public-private-protected.php

ViniGodoy

Não, essas palavras são modificadores de acesso. Você pode tê-los e ainda assim não ter encapsulamento.
Veja o link que postei ali, que explica alguns problemas comuns que quebram o encapsulamento e muita gente nem percebe até ser tarde demais.

x111

De uma olhada aqui.
O artigo é muito bom e dá uma dica de como usar o encapsulamento e quando ele não faz sentido.

P

uma vez um professor me explicou de uma forma boba mas até engraçada.
imagine uma mulher…
tem aquela que é de todos (public)[todos podem modificar o atributo e mecherem como quiserem]
aquela que é so da rodinha(protected)[somente as classes do mesmo pacote tem acesso]
e tem aquela que é só sua(private)[somente a classe que esta o atributo tem acesso]

no metodo set você cria regras para conseguirem mudar o que esta dentro da variavel. o get serve para mostrar o que esta na variavel…
ajudou?

xxmayconxx

Rá, agora consegui entender he he vlw

Criado 10 de janeiro de 2011
Ultima resposta 28 de jan. de 2011
Respostas 8
Participantes 7