Estou estudando POO, mas não consegui absorver o que é encapsulamento e nem pq ele é importante.
Vamos usar exemplos banais.
Imagine que você vai passar suas férias em um belo lugar.
Você decidiu que vai de avião, da companhia X.
Você não quer saber quem é o piloto, muito menos qual o avião.
Você quer que o avião seja seguro e confortável.
Que o piloto seja experiente e hábil.
Que consigua chegar ao destino.
Curtir suas férias e voltar para casa.
Ou seja, você não quer saber como a operação vai ser feita, mas o que tem que ser feito.
Os modificadores de acesso, são outra história.
Assim, diga qual dos itens abaixo “corresponte” a um encapsulamento:
a) chegar em casa a tempo da janta; ou
b) para chegar em casa a tempo da janta:
- espere o onibus no ponto x;
- desca no ponto y;
- olhe para os dois lados;
- chegue em casa;
- confirmar a hora para saber se chegou a tempo do jantar.
Resp: A
Pra mim, encapsulamento, NÃO é ESCONDER o que foi feito das outras classes, é uma relação de CONFIANÇA entre as classes.
Por exemplo, se você comprar um carro e desconfiar do motor, provavelmente ele NÃO faz o que foi especificado, isto é ferir o encapsulamento/ quebrar a confiança.
Eu posso olhar como o motor foi feito por curiosidade ou por aprendizado, mas não por desconfiança.
Se algo saiu errado, deve haver algum problema com o encapsulamento.
Quando você cria um método, sabe que ele está correto e o chama em outra classe, você está confiando no que fez e se quer lembra da ordem das linhas de código, isto seria o equivalente a encapsular a troca de mensagens, entre os objetos.
Agora se você precisa por questões de segurança, limitar o acesso do usuário a algum recurso, usando o private, package ou protected é por que aquele recurso é sensível e deve estar fora do alcançe DIRETO/SEM FILTROS de outros, onde o acesso encapsulado é mais claro do ponto de vista exemplificativo.
No que se refere a segurança, imagine que para ter acesso ao seu dinheiro, você deve fornecer credenciais no caixa eletrônico.
Você não chega e saca é realizado uma série de processos (encapsulados para você, cliente) com vistas ao fornecimento de recursos.
“Assim, o dinheiro/recurso, estaria encapsulado”.
Agora, tem coisas que são tão extremas, que o nível de confiança, não existe entre classes, do ponto de vista de segurança, por isso o private.
Veja na classe String exemplos com o modificador private, você vai ver métodos inecessíveis externamente.
Perceba que o encapsulamento abrange variáveis, métodos e classes.
Gostei dessa definição, @addller, nunca tinha pensado assim.
Gostaria de adicionar um exemplo prático, porém, banal. Considere a seguinte classe:
class Pessoa {
public String nome;
public int idade;
}
Quem pode garantir que alguém, talvez vc mesmo, não faria isso:
Pessoa p = new Pessoa();
p.nome = "123";
p.idade = -1;
Num sistema real essa situação poderia gerar conflitos estranhos ou relatórios confusos, afinal, não existe idade negativa ou nomes que começam com números. Como vc garante que uma Pessoa
sempre conterá dados corretos e confiáveis?
O primeiro passo é esconder os atributos da classe e criar métodos que controlem o acesso a eles.
class Pessoa {
private String nome;
private int idade;
public void setIdade(int idade) {
if ( idade < 18 )
throw new IdadeAbaixoDoLimite();
this.idade = idade;
}
public void setNome(String nome) {
/* considere que aqui tem uma série de
instruções que garantem que o nome é
válido antes de continuar, Ok? */
this.nome = nome;
}
/* Uma vez que vc escondeu os atributos, pode ser
necessário definir uma forma de acessá-los seguramente */
public String getNome() { return this.nome; }
public int idade() { return this.idade; }
}
E é isso. Talvez vc ache esse link interessante também: