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.
Alguem poderia me mostrar um exemplo em que o encapsulamento é indispensável?
8 Respostas
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!
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??? 
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.
Recomendo fortemente a leitura desse post:
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
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.
De uma olhada aqui.
O artigo é muito bom e dá uma dica de como usar o encapsulamento e quando ele não faz sentido.
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?
Rá, agora consegui entender he he vlw