ENCAPSULAMENTO

 

O Encapsulamento corresponde à uma proteção adicional aos dados de um objeto contra modificações impróprias. Neste sentido, deve-se garantir que modificadores de acesso sejam aplicados adequadamente nas declarações de classes, permitindo visibilidade externa, apenas através de determinados métodos. O conceito de encapsulamento está intimamente ligado ao conceito de ocultamento da informação (information hiding).

 
 

Imagine em sua casa, como seria se outras pessoas, que não são seus familiares ou amigos, entrassem sem permissão e usassem suas coisas. Seria uma grande bagunça, onde você não conseguiria controlar o fluxo de entrada e o uso de suas coisas. Por isso existem as portas, para que somente você ou quem você autorizar entre na casa, oferencendo-lhe segurança e evitando que a mesma fique bagunçada. Poderia-se dizer, inicialmente, que essas portas teriam características similares ao funcionamento da propriedade de Encapsulamento na Programação Orientada a Objeto.

 

Encapsular uma classe significa restringir o acesso aos seus atributos, normalmente usando private ou protected como modificador de acesso, além de permitir este acesso somente via métodos da própria classe.

 

Como um contra-exemplo ao encapsulamento, considere o código, a seguir:

 
/**
*Síntese
*   Atributo: nome
*   Métodos: peixe(), retornaNome(), modificaNome()
*/

public class Peixe {
    
    // atributos
    
    public String nome;
    
    // método construtor
    public peixe(String string) {
    	this.nome=string;
    }
    
    // outros métodos
    public String retornaNome() {
    	return nome;
    }

    public void modificaNome(String string){
     	this.nome=string;
    }
}
 

Pode-se observar na quarta linha do código anterior que a declaração do atributo público nome – que pode ser acessado por outra classe, compromete o principal objetivo do encapsulamento relacionado a proteção dos dados de um objeto. Tal comprometimento é exemplificado no próximo exemplo, no qual, em outra classe pode-se acessar diretamente o atributo nome do objeto, na nona linha do código a seguir.

 
 
/**
*Síntese
*   Objetivo: modificar o nome do peixe
*   Entrada: nome do peixe
*   Saída: nome do peixe alterado
*/

public class UsarPeixe {
    
    public static void main(String [] Args) {
    
        // Criando uma instacia de Peixe
        Peixe peixe = new Peixe("Marlin");
        
        // chamando o atributo nome
        System.out.println(peixe.nome);  // compromete o encapsulamento
        peixe.modificaNome("Garoupa");
        System.out.println("O nome do peixe é: " + peixe.retornaNome());
    }

}
 

No exemplo anterior, não se sabe se o atributo peixe.nome é de retorno ou de modificação, fazendo com que o seu programa fique inseguro e qualquer outra classe possa acessar e até modificar este atributo. Se emprega o encapsulando para usar somente a funcionalidade da classe e não modificar os atributos que a constróem.

 
 

Para proteger os atributos que compõem a classe são usados os qualificadores ou modificadores de acesso private ou protected, para que outras classes não modifiquem diretamente um atributo, mas que esta mudança possa acontecer por meio dos métodos existentes na própria classe. Assim, seus atributos serão acessados coerentemente e não comprometerão sua proteção. Tais métodos são identificados pelos prefixos get e set - o primeiro é usado para recuperar o conteúdo de um atributo (variável de instância) e o segundo prefixo indica o método para efetuar modificação de seu conteúdo. Por exemplo: para o nome do peixe tem-se o método getNome() e setNome().

 

Sendo assim, para garantir o encapsulamento na classe Peixe, é aplicado o modificador de acesso private e os métodos get()/set() apropriados, conforme o código a seguir:

 
/**
*Síntese
*   Atributos: nome
*   Métodos: getNome(), setNome().
*/

public class Peixe {
    
    // atributos
    private String nome;
    
    // métodos
    public String getNome() {
    	return nome;
    }
    
    public void setNome(String string) {
     	this.nome=string;
    }
}
 

Na quarta linha é declarado o atributo nome como private e formalizado o acesso a tal atributo, apenas via os métodos públicos getNome() – para recuperar o seu conteúdo; e setNome() – para alterar o seu conteúdo. Desta forma, se garante proteção aos dados, contidos nos atributos, dos objetos do tipo Peixe, onde somente os seus próprios métodos conseguem manipulá-los.

 
/**
*Síntese
*   Objetivo: modificar o nome do peixe
*   Entrada: nome do peixe
*   Saída: novo nome do peixe
*/

public class UsarPeixe {

    public static void main(String [] args) {
        // criando a instacia     
        Peixe peixe = new Peixe();
        
        // acessando o atributo nome
        peixe.setNome("Marlin");
        System.out.println(peixe.getNome()); // usando encapsulamento
        peixe.setNome("Garoupa");
        System.out.println("O nome do peixe é: "+ peixe.getNome());
    }
}
 

No exemplo anterior um método da classe Peixe (setNome) é acionado para realizar a alteração do atributo nome existente nesta classe. Dessa forma, a classe UsarPeixe não consegue alterar tal atributo diretamente, evitando possíveis problemas e erros que tal alteração pudesse ocasionar.

 

A linguagem Java possui alguns qualificadores de acesso, também chamados de modificadores de acesso. Os 4 principais são indicados por palavras reservadas nesta linguagem e definem como classes, métodos e/ou atributos poderão ser acessados. Estas palavras reservadas ou chaves são: private, protected, public ou package (qualificador padrão).

 
  • private: os métodos ou atributos declarados com este qualificador só podem ser acessados de dentro da própria classe que os criou. Nem mesmo suas subclasses podem acessá-los. Os recursos definidos com private não serão herdados;
  •  
  • proctected: qualificador que define o acesso aos métodos e atributos de uma classe somente pelo processamento da própria classe e de suas subclasses;
  •  
  • package: quando o qualificador não é definido (sem uso de palavra reservada) é assumida esta definição (padrão em Java) que permite o acesso por métodos da própria classe, suas subclasses ou qualquer outra classe definida no mesmo pacote do recurso a ser acessado;
  •  
  • public: este qualificador de acesso indica que a classe, o método e/ou o atributo declarado pode ser acessado por qualquer outra classe ou subclasse que os deseje acionar, pois não existem restrições quanto ao seu acesso, podendo acontecer por outras classes de outros pacotes (são recursos públicos).
  •  

Uma expressão chave, comumente utilizada em aplicações Java é static. Esta palavra reservada indica que o método ou atributo está vinculado a classe e não aos seus objetos. Portanto, tal recurso definido como static será compartilhado por todos os objetos provenientes de sua classe, ou seja, um atributo definido como static será o mesmo e possuirá o mesmo valor armazenado em todas as instâncias desta classe. Quando este valor for modificado, todas as outras instâncias desta classe (objetos) acessarão este novo valor. As declarações com métodos permitirão que a classe o acesse diretamente e não pela sua instância.

 
Com intuito de apoiar o aprendizado sobre Orientação a Objeto, sugere-se assistir a videoaula para o aperfeiçoamento no conhecimento deste conteúdo.
 

Atividade de Fixação

 

No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como seu entendimento sobre este conteúdo está, estão sendo sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento nesta disciplina.