quinta-feira, junho 21, 2007

Encapsulamento

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());

}

}