Baixe o app para aproveitar ainda mais
Prévia do material em texto
* * - Encapsulamento - Flávio Ferro Técnicas de Programação 1 * * Tópicos Acessando atributos e Métodos Information Hiding Métodos get() e set() Exercício * * Acessando Membros de Objetos Lembrando que, uma vez criado o objeto seus membros podem ser acessados usando o operador “.” : (<objeto>.<membro>) Por exemplo: c1.numConta = “001”; //Acessando atributos c1.depositar(); //Acessando métodos Conforme mencionado, o acesso direto aos atributos não deve ser permitido * * Solução: Proteger/ocultar o estado interno de um objeto servidor de ser corrompido pelos objetos clientes Fornecer uma interface com operações que manipulem o estado do objeto servidor Information Hiding Problema: c1.saldo = -2.0; //saldo inválido * * Information Hiding O ato de ocultar detalhes de implementação de um objeto é chamado de “information hiding ” ou encapsulamento Atributos devem ser todos privados (modificador private) Por exemplo: public class ContaCorrente{ private String numero; private double saldo; } * * Lab1 - Encapsulando Atributos Encapsule o estado da classe ContaCorrente. Verifique quais erros o encapsulamento provocou. * * Encapsulamento O acesso a um membro privado fora da classe ocasiona um erro de compilação Deve-se construir a interface do objeto com métodos públicos (modificador public) Métodos para manipulação do estado do objeto para alteração (métodos mutators) ou acesso (métodos accessors) * * Encapsulamento Método de Acesso retorna um valor, sendo nomeado da seguinte forma: get + nome do atributo a ser retornado * * Encapsulamento Método de Alteração não retorna nenhum valor (void), sendo nomeado da seguinte forma: set + nome do atributo a ser modificado * * Encapsulamento public class ContaCorrente{ private String numero; private double saldo; public void setNumero(String pNum){numero = pNum;} public String getNumero(){return numero;} public double getSaldo(){return saldo;} public boolean depositar(double pVal){...} public boolean sacar(double pVal){...} } Classe ContaCorrente com atributos privados, métodos accessors e mutators * * Lab1 - Métodos (get/set) Implemente um método mutatório (set) que grave um número de conta (passado como argumento) no atributo número e um valor de saldo (passado como argumento) no atributo saldo. Implemente métodos na classe ContaCorrente que permitam o acesso (get) a seus atributos(número e saldo) Na classe TestaContaCorrente: Crie um objeto do tipo ContaCorrente Grave valores em seus atributos (número e saldo) Mostre para o usuário os valores dos atributos do objeto criado * * Aprendizagem1 - Encapsulamento Exemplo: Agenda: guardar uma data e uma anotação importante a ser lembrada. Crie um novo projeto denominado Agenda. Não crie a classe principal Clique com o botão direito do mouse em cima do Pacote Padrão e adicione um nova classe Java denominada Agenda. Adicione o código: * * Aprendizagem1 - Encapsulamento Crie um método “anote” que anotará a descrição do dia. * * Aprendizagem1 - Encapsulamento É importante também verificar se a data da anotação é uma data válida. Se for uma data válida registra-se a anotação, caso contrário a anotação recebe uma informação de data inválida. * * Aprendizagem1 - Encapsulamento * * Aprendizagem1 - Encapsulamento Onde está o encapsulamento? Calma! O objetivo desse exemplo é mostrar a fragilidade do código que não usa o encapsulamento. * * Aprendizagem1 - Encapsulamento Para isso, criaremos dois objetos com a classe Agenda: agenda1 e agenda2. agenda1 – uma anotação com uma data válida, e agenda2 – uma data inválida. Finalmente, consultaremos os dados dos atributos de cada objeto, em especial a anotação que foi registrada, utilizando o método mostraAnotacao(). * * Aprendizagem1 - Encapsulamento Clique com o botão direito do mouse em cima do Pacote Padrão e adicione um nova classe Java denominada Main. Adicione o método main para que possamos executar a aplicação: * * Aprendizagem1 - Encapsulamento Adicione o código abaixo para testarmos a fragilidade do código que não usa o encapsulamento. Resultado: * * Aprendizagem1 - Encapsulamento Veja o que acontece se fizéssemos uma pequena modificação no método main(). Adicione o código: Resultado: * * Aprendizagem1 - Encapsulamento Veja que sua Agenda permitiu que você inserisse uma data inválida para uma anotação. Isso significa que seu código está suscetível a falhas. Qual é a solução? Encapsulamento. Codificar em OO usando o encapsulamento nada mais é que aplicar os modificadores de acesso às classes. * * Aprendizagem1 - Encapsulamento Sem Modificadores de Acesso * * Aprendizagem1 - Encapsulamento A classe Agenda não usa nenhum dos modificadores de acesso de forma explícita. Implicitamente ela é Package ou Friendly. O modificador de acesso Package permite que classes do mesmo pacote acessem atributos ou métodos que estejam com tal modificador. Considerando que a classe Principal está no mesmo pacote, então, ele tem acesso aos atributos e métodos da classe Agenda. * * Aprendizagem1 - Encapsulamento Quando a classe Principal teve acesso aos atributos da classe Agenda? O método main da classe principal está acessando os atributos, dia, mes, ano e anotacao da classe Agenda. E está modificando informações sem passar pelo teste de validade da data. * * Aprendizagem1 - Encapsulamento Aplicando o encapsulamento: Private para os atributos e o método validaData(), Public para os métodos anote() e mostraAnotacao(). * * Aprendizagem1 - Encapsulamento * * Aprendizagem1 - Encapsulamento Agora, o compilador já não aceita usar os comandos abaixo. Isso causaria erro! Ou seja, os atributos da classe Agenda agora são privados apenas para a uso da própria classe Agenda. * * Aprendizagem1 - Encapsulamento Com essa modificação, só é possível inserir uma anotação na classe Agenda usando o método anote(). O método anote() garante que a data inserida para a anotação será validada com o método validaData(), que também é privado ao uso apenas da classe Agenda. * * Exercício 1 Estenda o Exercício 2 (do Aula Anterior), encapsulando os atributos da classe candidato. Disponibilize métodos de acesso e mutação para os atributos que foram encapsulados. Na classe aplicativo, ilustre a utilização dos métodos implementados. * * Pontos Principais O estado interno do objeto deve ser protegido/escondido dos outros objetos (informatiom hiding ou encapsulamento) Todos os atributos de uma classe devem ser privados (modificador private) Deve-se disponibilizar métodos accessor(get) e mutator(set) para permitir a manipulação dos atributos privados *
Compartilhar