Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
* * * Que problemas de controle de dados podemos ter na classe abaixo? _____________________ class Conta { String nome; double saldo; void saca(double quantidade) { double novoSaldo = this.saldo - quantidade; this.saldo = novoSaldo; } void deposita(double quantidade) { this.saldo += quantidade; } } . * * * Visibilidade _____________________ Visibilidade indica até que ponto os atributos (variáveis de instância) e os métodos declarados em uma classe são acessíveis a outras classes. Os termos public e private são responsáveis por controlar a visibilidade entre os elementos das classes. Public e Private são chamados de Controladores de acesso. * * * Controladores de acesso _____________________ As variáveis de instancia e os métodos que são declaras pelo public, podem ser instanciados por qualquer classe. O termo private restringe o acesso aos métodos e as variáveis somente a própria classe que os originou, nenhum objeto externo poderá instanciar esses elementos. * * * Usando public e private. _____________________ public class Poupanca { private double taxa_rendi=0.06; private double total_conta=0.0; public void investir (double invest) { total_conta = total_conta + invest + (taxa_rendi*total_conta); System.out.println("total da conta:"+total_conta); } } public class Cliente { public static void main (String args[]) { Poupanca poup = new Poupanca (); poup.investir(20.00); } } * * * Encapsulamento _____________________ Encapsular tem como objetivo esconder todos os membros de uma classe (como vimos acima), além de esconder como funcionam as rotinas (no caso métodos) do nosso sistema. Encapsular é fundamental para que seu sistema seja sucetível a mudanças: não precisaremos mudar uma regra de negócio em vários lugares, mas sim em apenas um único lugar, já que essa regra está encapsulada. * * * Interface de classe _____________________ O conjunto de métodos públicos de uma classe é também chamado de interface da classe, pois esta é a única maneira a qual você se comunica com objetos dessa classe. É sempre bom programar pensando na interface da sua classe, como seus usuários a estarão utilizando, e não somente em como ela irá funcionar. A implementação em si, o conteúdo dos métodos, não tem tanta importância para o usuário dessa classe, uma vez que ele só precisa saber o que cada método pretende fazer, e não como ele faz, pois isto pode mudar com o tempo. * * * Interfaces no dia-a-dia _____________________ Quando você dirige um carro, o que te importa são os pedais e o volante (interface) e não o motor que você está usando (implementação). É claro que um motor diferente pode te dar melhores resultados, mas o que ele faz é o mesmo que um motor menos potente, a diferença está em como ele faz. Para trocar um carro a álcool para um a gasolina você não precisa reapreender a dirigir! Trocar a implementação dos métodos não precisa mudar a interface, fazendo com que as outras classes continuem usando eles da mesma maneira. * * * Implementação de Interface _____________________ class Cliente { private String cpf; public void mudaCPF(String cpf) { if (contarDigitoCPF(cpf)) { this.cpf = cpf; } } private boolean contarDigitoCPF (String cpf) { if (cpf.length() == 11 ) { return true; } else { return false; } } } * * * Implementação de Interface _____________________ Construa uma classe com método main chamada CriaCliente, que instancie um objeto da classe Cliente anterior; Tente manipular os dados dos atributos e com método contarDigitoCPF da classe Cliente; Por fim, manipule o método * * * Getters e Setters _____________________ Para permitir o acesso aos atributos (já que eles são private) de uma maneira controlada, a prática mais comum é criar dois métodos, um que retorna o valor e outro que muda o valor. O padrão para esses métodos é de colocar a palavra get ou set antes do nome do atributo. * * * Classe Conta com gets e sets _____________________ public class Conta { private double saldo; private double limite; public double getSaldo() { return this.saldo; } public void setSaldo(double saldo) { this.saldo = saldo; } public double getLimite() { return this.limite; } } * * * Boas práticas _____________________ É uma má prática criar uma classe e, logo em seguida, criar getters e setters pros seus atributos. Você só deve criar um getter ou setter se tiver a real necessidade. Repare que nesse exemplo setSaldo não deveria ter sido criado, já que queremos que todos usem deposita() e saca(). * * * Algumas observações _____________________ O método getSaldo não devolve simplesmente o saldo... e sim o que queremos que seja mostrado como se fosse o saldo. Utilizar getters e setters não só ajuda você a proteger seus atributos, como também possibilita ter de mudar algo em um só lugar... chamamos isso de encapsulamento, pois esconde a maneira como os objetos guardam seus dados. * * * Getter e Setter para atributos boolean _____________________ O padrão dos métodos get e set não vale para as variáveis de tipo boolean. Esses atributos são acessados via is e set. Por exemplo, para verificar se um carro está ligado seriam criados os métodos isLigado e setLigado. * * * Exercício 4 _____________________ Crie uma classe chamada Disco, que contenha o atributo capacidadeDisco (int), e também os métodos setcapacidadeDisco (int capacidade) e getcapacidadeDisco. O primeiro método irá apanhar o valor do argumento capacidade e somá-lo ao atributo capacidadeDisco. Já o segundo, retorna o valor do atributo capacidadeDisco. * * * Exercício 4 _____________________ Crie uma segunda classe chamada Computador, que tem como atributos modelo (String) e disc (Disco), e também os métodos, setModelo (String n), que irá atribuir valor do argumento n à variável do atributo modelo, e getModelo, irá retornar o valor do atributo modelo. Além desses métodos, deverá ser criado o getTotalDisco(), que retornará o valor da capacidade do disco referente ao atributo disc. Crie um método private chamado isLimiteCapacidade, que verifique se a capacidade do disco for superior a 8, então retornará true, caso contrário retornará false. Crie também outro método chamado setAdicionarDisco (Disco disco,int quantidade), que tem como objetivo verificar o status do método isLimiteCapacidade(), se for true imprima "Não é possível adicionar mais disco“, caso contrário adicione o valor de quantidade para a capacidade do disco do atributo disc. * * * Exercício 4 _____________________ Por fim, crie uma classe principal chamada CriarComputador, onde deve ser instanciado os objetos das classes Disco e Computador. Atribua valor aos métodos setModelo e imprima o valor de Modelo usando getModelo. Adicione o valores ao método setAdicionarDisco e imprima o valor de getTotalDisco().
Compartilhar