A capacidade que um objeto tem de impedir que outros objetos tenham acesso aos seus dados é denominado de encapsulamento. O encapsulamento é a técnica empregada para garantir a ocultação de informação na qual a interface e implementação de uma classe são separadas sintaticamente. Com isso, somente os métodos pertencentes a um objeto podem ter acesso aos dados encapsulados. O encapsulamento encoraja a modularidade do programa e permite que decisões de projetos fiquem “escondidas” dentro da implementação de modo a restringir possíveis interdependências com outras classes, exceto por meio da sua interface [6].
Assim como abstração, o conceito de encapsulamento não é exclusivo da abordagem de orientação a objetos. Entretanto, a habilidade de se combinar estrutura de dados e comportamento em uma única entidade torna o encapsulamento mais elegante e mais poderoso do que em linguagens convencionais que separam estruturas de dados e comportamento [11].
Um bom exemplo de encapsulamento seria um disco rígido. A interface do disco rígido deixa acessível ao computador (cliente) suas funções de leitura e escrita, os dispositivos mecânicos e eletromagnéticos que o HD utiliza para realizar tais operações não fica acessível ao seu cliente estando assim encapsulados.
Os exemplos a seguir foram escritor utilizando a linguagem Java. Entretanto, a idéia aplica-se a qualquer linguagem de programação OO. Atente ao fato de que cada linguagem de programação define os literais de palavra reservada para definir seus modificadores de acesso.
Sem encapsulamento:
class NaoEncapsulado {
//implicitamentamente há modificador, mas não é o mais restritivo.
int semProtecao;
}
public class TesteNaoEncapsulado {
public static void main(String[] args) {
NaoEncapsulado ne = new NaoEncapsulado(); //ne é uma instância de NaoEncapsulado
ne.semProtecao = 10; //acesso direto ao atributo
System.out.println("Valor sem proteção: " + ne.semProtecao); //acesso direto ao atributo
}
}
Com encapsulamento:
class Encapsulado {
//private é um modificador de acesso de restrição máxima
private int comProtecao;
public void setComProtecao(int comProtecao) {
this.comProtecao = comProtecao;
}
public int getComProtecao() {
return this.comProtecao;
}
}
public class TesteEncapsulado {
public static void main(String[] args) {
Encapsulado e = new Encapsulado(); //"e" é uma instância de Encapsulado
//acesso direto a um atributo protegido implicará em erro de compilação.
e.comProtecao = 10;
//deve-se acessar o atributos de forma indireta, encapsulado.
e.setComProtecao(10);
System.out.println("Valor com proteção: " + e.getComProtecao());
}
}