Olá Pessoal, tudo bem?

Nesse artigo, venho passar um pouco do meu modesto conhecimento sobre encapsulamento em java.

Esse de destina às pessoas que ja tenham algum conhecimento de classes em java, porém acredito que não sera dificil para um iniciante acompanhar o exemplo.

Quando criamos uma classe, é de costume e indicado ter todos os seus atributos como private e não como public. Porque?

Simples.

Vamos tomar como exemplo uma classe onde implementamos uma conta bancária bem simples. Temos dois atributos, que inicialmente deixaremos como public:

//Declaração dos Atributos
public double Saldo=0;
public String Nome;

Temos tambem um método chamado deposita() que alimenta o atributo Saldo com o valor de Saldo + um valor dado qualquer + 10% desse valor passado como parametro.

public void deposita(double Valor){
//deposita o Valor + 10% dele
this.Saldo = this.Saldo + Valor + (Valor * 0.10);
}

Agora, como nosso atributo Saldo esta como public, ou seja, é acessivel de fora da classe, nada impede de algum outro programador que esteja envolvido no nosso projeto de exeutar o codigo a seguir:

Conta c1=new Conta();
c1.Saldo=10000;

Isso deixaria o dono da conta c1 bem feliz, mas o que acontece é que não foi realizado aquele adicional de 10% ao saldo, como no metodo deposita(double Valor). Isso não é a ideia, pois queremos que quem for depositar uma quantia na conta, que deposite pelo metodo adequado, pois só assim os calculos necessários serão executados.

Se alterarmos os atributos da nossa classe para private nós não deixaremos que haja acesso direto ao atributo, só deixando esses acessíveis de dentro da classe.

private double Saldo=0;
private String Nome;

Agora sim seremos "obrigados" a usar o método deposita(double Valor) para alterarmos o valor de Saldo. O mesmo vale tambem se quisermos criar agora um meio para sacar uma quantia da conta, ficando como a seguir:

public void saca(double Valor){
this.Saldo = this.Saldo - Valor;
}

Mas e se quisermos obter o saldo? Não poderiamos utilizar diretamente o valor do atributo Saldo. Precisaremos então criar um método para obter esse valor, já que o atributo Saldo é privado à classe.

public double getSaldo(){
return this.Saldo;
}

Isso é chamado de Getter, um método que foi feito só com o intuito de retornar um valor de um atributo privado.

Outro conceito é o do Setter, que nada mais é que um método com o intuito de alterar o valor de nosso atributo privado. Faremos ambos para o atributo Nome de nossa classe:

public void setNome(String N){
this.Nome = N;
}

public String getNome(){
return this.Nome;
}

Isso tudo, é para encapsular nossa classe, ou seja, fazer com que o único meio de alterar atributos nela contidos seja através de seus próprios métodos.

Abaixo segue o exemplo completo da classe Conta e ja contendo o método main para exemplificar o uso da classe.

class Conta {
//Declaração dos Atributos
private double Saldo=0;
private String Nome;

//Declaração dos Metodos
public void deposita(double Valor){
//deposita o Valor + 10% dele
this.Saldo = this.Saldo + Valor + (Valor * 0.10);
}
public double getSaldo(){
return this.Saldo;
}

public void setNome(String N){
this.Nome = N;
}

public String getNome(){
return this.Nome;
}

//Utilizando agora a classe Conta
public static void main(String[] args){
//instanciando duas contas, c1 e c2
Conta c1=new Conta();
Conta c2=new Conta();

//Definindo o nome de ambas pelo metodo setNome
c1.setNome("Fulano da silva");
c2.setNome("Beltrano de oliveira");

//depositando
c1.deposita(100);
c2.deposita(200);

//imprimindo o saldo e o nome dos clientes
System.out.println("c1 - Nome: "+c1.getNome());
System.out.println("c1 - Saldo: "+c1.getSaldo());
System.out.println("c2 - Nome: "+c2.getNome());
System.out.println("c2 - Saldo: "+c2.getSaldo());
}
}

Bem, fico por aqui. Agradeço a paciência e espero ter ajudado. Dúvidas e sujestões entrem em contato.

contato@thiagoapadua.com.br