Neste post vou comentar o conceito chamado Encapsulamento relativo a programação orientada a objetos (POO). Observem as perguntas iniciais:
- Por que encapsular informações em nosso programa?
- Como fazemos isso na prática usando Java?
- É realmente necessário encapsular?
Essas questões são abordadas no vídeo que fiz (veja abaixo) para tentar responder as duas primeiras perguntas acima. Porém, a terceira pergunta é mais difícil de explicar. Alguém poderia dar uma resposta ou opinar sobre isso?
Encapsulamento, segundo Wikipédia (fonte: http://pt.wikipedia.org/wiki/Encapsulamento):
"Encapsulamento vem de encapsular, que em programação orientada a objetos significa separar o programa em partes, o mais isoladas possível. A idéia é tornar o software mais flexível, fácil de modificar e de criar novas implementações."Ou seja, é uma forma de tornar visível para o usuário as funcionalidades que são importante para o sistema e somente isso. Em nosso exemplo, temos a classe Cliente que na prática, adicionou o tipo de acesso private do Java nos atributos e o tipo de acesso público nos métodos da classe. Só que foram criados um par de métodos (GET e SET) para recuperar e alterar, respectivamente, para cada atributo.
public class Cliente {
// atributos para representar o cliente com acesso PRIVATE
private String nome;
private String CPF;
private int quantidadePedidos;
// para que se possa acessar os dados, criamos métodos PÚBLICOS get e set
// para
// cada atributo que se pretenda dar esse acesso
/**
* @return the nome
*/
public String getNome() {
return nome;
}
/**
* @return the cPF
*/
public String getCPF() {
return CPF;
}
/**
* @return the quantidadePedidos
*/
public int getQuantidadePedidos() {
return quantidadePedidos;
}
/**
* @param nome the nome to set
*/
public void setNome(String nome) {
this.nome = nome;
}
/**
* @param cPF the cPF to set
*/
public void setCPF(String cPF) {
CPF = cPF;
}
/**
* @param quantidadePedidos the quantidadePedidos to set
*/
public void setQuantidadePedidos(int quantidadePedidos) {
this.quantidadePedidos = quantidadePedidos;
}
// operacoes que o cliente poderá
// fazer neste sistema
public void efetuarPedidoCompra() {
System.out.println("efetuando pedido de compra");
quantidadePedidos++;
}
// imprimir os seus valores
@Override
public String toString() {
String atributosClasse = "Nome: " + nome + ", CPF: " + CPF
+ " , quantidade pedidos: " + quantidadePedidos;
return atributosClasse;
}
}
Isso simplesmente porque ao mudar o tipo de acesso aos atributos o Java não terá mais acesso a referência direta para LER e ESCREVER. Logo, temos que criar métodos para cada atributo GET e SET (sujestão de nome do Java). Desta maneira, quando precisarmos acessar (LER) o atributo do objeto usaremos: Cliente c = new Cliente();
// acesso para ESCREVER (write)
c.setNome("Douglas Frari");
c.setCPF("222.222.222.11");
// acesso para LER (read)
System.out.println("Nome: "+c.getNome());
System.out.println("CPF: "+c.getCPF());
// ACESSO direto NAO é permitido pelo comilador java
// se não for da mesma classe. Logo, é preciso usar os SETs neste caso
c.nome = "Douglas Frari";
c.CPF = "222.222.222.11";
E quanto a pergunta 3 (É realmente necessário encapsular?)
É importante perceber que não é necessário encapsular para que o programa funcione. Mas é uma boa prática SIM encapsular os dados (atributos), pois assim tornamos o acesso DIRETO às referências dos objetos "seguros" do ponto de visto de escrita e leitura. O acesso somente será permitido usando os métodos públicos GET e SET.