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).
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.