O que é encapsulamento?

No meu sistema de cadastro de livros eu preciso do nome e do preço:

public class Livro {

     private final String nome;
     private final double preco;

     public Livro(String nome, double preco) {
          this.nome = nome;
          this.preco = preco;
     }

     //métodos

}

Para cadastrar um livro eu preciso passar as informações e enviar para o banco de dados:

Livro livro = new Livro("Java", 27.83);

Conexao conexao = pegaConexaoComOBancoDeDados();
		
conexao.cadastraLivro(livro);
conexao.fechaConexao();

Todas as vezes que eu quiser cadastrar um livro eu terei que instanciá-lo, pegar uma conexão, salvar o livro e fechar a conexão. Vamos supor que agora nós precisamos verificar se o livro já existe no banco e, caso exista, precisamos atualizar em vez de salvar:

Livro livro = new Livro("Java", 27.83);

Conexao conexao = pegaConexaoComOBancoDeDados();

if(!conexao.existeLivro(livro)){
     conexao.cadastraLivro(livro);
} else{
     conexao.atualizaLivro(livro);
}
conexao.fechaConexao();

Quanto mais procedimentos para poder salvar o livro eu precisar, maior ficará a minha rotina de salvar livros. Imagine todas as classes que precisarem salvar um livro, terão que ser atualizadas todas as vezes que houver uma mudança! É uma péssima solução… Que tal mudarmos esse procedimento de salvar o livro para um único método? Então, ficaria:

Livro livro = new Livro("Java", 27.83);

salvaLivro(livro);

public void salvaLivro(Livro livro){
     Conexao conexao = pegaConexaoComOBancoDeDados();	
     if(!conexao.existeLivro(livro)){
          conexao.cadastraLivro(livro);
     } else{
          conexao.atualizaLivro(livro);
     }
     conexao.fechaConexao();
}

Agora não precisamos saber sobre conexão ou qualquer procedimento para salvar um livro, apenas chamamos o método salvaLivro(), enviamos o livro, e ele faz tudo por nós! Quando transformamos um procedimento que apresenta muitas regras de negócio ou rotinas complexas em um método, chamamos isso de encapsulamento. E se tivermos que fazer um backup dos livros cada vez que salvar ou atualizar? Bastaria adicionar esse trecho em um único lugar, ou seja, no método salvaLivro():

//continuo usando o salvaLivro() do mesmo jeito
salvaLivro(livro);

public void salvaLivro(Livro livro){

     //rotina para salvar livro
     conexao.fazBackupDoLivro();
     conexao.fechaConexao();
}

O código mudou e continuamos utilizando o método sem nenhuma preocupação se ele mudou ou não! Além disso, o código foi modificado em apenas um lugar, ou seja, não precisamos nos preocupar se vai quebrar o nosso sistema em todos os outros lugares que usam esse método! Além de ser mais elegante, torna o nosso sistema manutenível.

É sempre importante verificar em todos os pontos do código aonde é possível aplicar o encapsulamento, pois ganhamos muitos benefícios:

  • Melhor manutenção de código.
  • Divisão de responsabilidades.
  • Reutilização de código.

E aí, gostou do encapsulamento? Está pronto para analisar o seu código e verificar aonde ele pode ser aplicado? O encapsulamento faz parte de uma das boas práticas de refatoração de código onde é apresentado detalhadamente no curso de Refatorando na prática, que demonstra como fazer manutenção em um sistema com um código de qualidade utilizando as boas práticas de refatoração.

Fique por dentro

(Última atualização em: 7 de dezembro de 2015)

Content Editor at Alura and Software Developer

Próximo ArtigoOrdenando números em Java