Talilo

Get e set.txt

Sep 17th, 2022 (edited)
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.68 KB | None | 0 0
  1. Vamos incrementar nosso código, modificando-o de acordo com as aulas.
  2.  
  3. 1) Vamos proteger os atributos da classe Conta, para isso adicione a palavra reservada private:
  4.  
  5. private double saldo;
  6. private int agencia;
  7. private int numero;
  8. private Cliente titular;COPIAR CÓDIGO
  9. Repare que quando fazemos isso, não conseguiremos mais acessar os valores.
  10.  
  11. 2) Precisamos criar métodos que nos possibilite receber os valores dos atributos, ou até alterá-los, caso seja interessante. Para isso criaremos os Getters e os Setters, siga os modelos abaixo e modifique para que retorne/altere o atributo correto!
  12.  
  13. Não esqueça de alterar o tipo de retorno do método! Nesse caso é double
  14.  
  15. //Getter
  16.  
  17. public double getSaldo(){
  18.     return this.saldo;
  19. }
  20.  
  21. //Setter
  22. public void setNumero(int numero){
  23.     this.numero = numero;
  24. }COPIAR CÓDIGO
  25. No curso criamos getSaldo, getNumero, setNumero, getAgencia, setAgencia, setTitular, getTitular.
  26.  
  27. 3) Na classe Cliente, escreva os métodos getters e setters e modifique os atributos adicionando private
  28.  
  29. Faça uma classe de teste e veja as possibilidades, dessa forma, esse conhecimento será consolidado!
  30.  
  31. Nosso código está abaixo, apenas clique para ver a opinião, mas recomendamos que tente fazer antes de ver o código completo!
  32.  
  33. ----------------------------------------------
  34. Nossa classe Conta está da seguinte forma:
  35.  
  36.  
  37. public class Conta {
  38.  
  39.     private double saldo;
  40.     private int agencia;
  41.     private int numero;
  42.     private Cliente titular;
  43.  
  44.     public void deposita(double valor) {
  45.         this.saldo = this.saldo + valor;
  46.     }
  47.  
  48.     public boolean saca(double valor) {
  49.         if(this.saldo >= valor) {
  50.             this.saldo -= valor;
  51.             return true;
  52.         } else {
  53.             return false;
  54.         }
  55.     }
  56.  
  57.     public boolean transfere(double valor, Conta destino) {
  58.         if(this.saldo >= valor) {
  59.             this.saldo -= valor;
  60.             destino.deposita(valor);
  61.             return true;
  62.         }
  63.         return false;
  64.     }
  65.  
  66.     public double getSaldo(){
  67.         return this.saldo;
  68.     }
  69.  
  70.     public int getNumero(){
  71.         return this.numero;
  72.     }
  73.  
  74.     public void setNumero(int numero){
  75.         this.numero = numero;
  76.     }
  77.  
  78.     public int getAgencia(){
  79.         return this.agencia;
  80.     }
  81.  
  82.     public void setAgencia(int agencia){
  83.         this.agencia = agencia;
  84.     }
  85.  
  86.     public void setTitular(Cliente titular){
  87.         this.titular = titular;
  88.     }
  89.  
  90.     public Cliente getTitular(){
  91.         return this.titular;
  92.     }
  93.  
  94. }COPIAR CÓDIGO
  95. Nossa classe Cliente:
  96.  
  97. public class Cliente {
  98.  
  99.     private String nome;
  100.     private String cpf;
  101.     private String profissao;
  102.  
  103.     public String getNome() {
  104.         return nome;
  105.     }
  106.     public void setNome(String nome) {
  107.         this.nome = nome;
  108.     }
  109.     public String getCpf() {
  110.         return cpf;
  111.     }
  112.     public void setCpf(String cpf) {
  113.         this.cpf = cpf;
  114.     }
  115.     public String getProfissao() {
  116.         return profissao;
  117.     }
  118.     public void setProfissao(String profissao) {
  119.         this.profissao = profissao;
  120.     }
  121.  
  122. }COPIAR CÓDIGO
  123. Dúvidas? Pergunte no fórum!
  124. -------------------------------
  125. Durante o aprendizado dos Getters e Setters é normal pensar sempre na necessidade deles para alterar algum estado dos nossos objetos.
  126.  
  127. Mas o uso dessa prática nem sempre é a mais indicada e expressa a realidade.
  128.  
  129. Observe a classe Conta representada abaixo que usa apenas getter e setters como métodos:
  130.  
  131. class Conta{
  132.     private String titular;
  133.     private double saldo;
  134.  
  135.     public void setTitular(String titular){
  136.         this.titular = titular;
  137.     }
  138.  
  139.     public String getTitular(){
  140.         return titular;
  141.     }
  142.  
  143.     public void setSaldo(double saldo){
  144.         this.saldo = saldo;
  145.     }
  146.  
  147.     public double getSaldo(){
  148.         return saldo;
  149.     }
  150.  
  151. }COPIAR CÓDIGO
  152. Continuamos usando atributos privados e nosso modelo parece seguir perfeitamente a proposta do encapsulamento onde a própria classe gerencia o seus estados(atributos). Uma utilização clássica dessa Conta nos levaria ao seguinte cenário:
  153.  
  154. Conta conta = new Conta();
  155. conta.setTitular("Fábio")
  156. conta.setSaldo(100.0);COPIAR CÓDIGO
  157. Tudo parece perfeito, agora imagine que seja necessário sacar 50.0 dessa conta. Essa operação vai exigir que o saldo seja suficiente. Uma simples verificação como a seguir asseguraria que o saldo não tenha ficado negativo. Nesse nosso exemplo não há limite além do saldo :)
  158.  
  159. Conta conta = new Conta();
  160. conta.setTitular("Fábio")
  161. conta.setSaldo(100.0);
  162.  
  163. double valorSaque = 50.0
  164.  
  165. if(conta.getSaldo() >= valorSaque){
  166.     double novoSaldo = conta.getSaldo() - valorSaque;
  167.     conta.setSaldo(novoSaldo)
  168. }COPIAR CÓDIGO
  169. Funcionou! Mas um problema é que essa lógica de restringir o saque à quantidade de saldo vai ter que ser refeita toda vez que for necessária uma operação de saque na nossa conta. Além do problema de duplicações desse trecho, um problemão para encapsulamento é que quem está de fato controlando as regras do saldo da conta é quem está usando a Conta. Em outras palavras nada impede que alguém implemente um limite extra para isso e tenha uma regra completamente diferente dos demais objetos do tipo Conta:
  170.  
  171. Conta conta = new Conta();
  172. conta.setTitular("Fábio");
  173. conta.setSaldo(100.0);
  174.  
  175. double valorSaque = 50.0;
  176.  
  177. if(conta.getSaldo() + 1000.0 >= valorSaque){
  178.     double novoSaldo = conta.getSaldo() - valorSaque;
  179.     conta.setSaldo(novoSaldo)
  180. }COPIAR CÓDIGO
  181. Quando construímos classes que se limitam a ter atributos privados com os setters e getters normalmente dizemos que são classes que só carregam valor, por isso são comumente chamados de classes fantoches ou Value Objects.
  182.  
  183. Uma classe fantoche é a que não possui responsabilidade alguma, a não ser carregar um punhado de atributos! Definitivamente isso não é a Orientação a Objetos! Esse modelo embora usado em alguns momentos não deve ser prática comum ao desenvolver o domínio do nosso projeto com risco de se cair no Modelo Anêmico que é exatamente o que a Conta hoje é. Uma classe onde os dados e comportamentos/lógicas não estão juntos.
  184.  
  185. Voltando ao nosso exemplo da Conta, percebe-se que no mundo real as operações poderiam ser representadas com métodos como saca( ) e deposita( ) em vez de só termos setSaldo( ):
  186.  
  187. class Conta{
  188.     private String titular;
  189.     private double saldo;
  190.  
  191.     public void setTitular(String titular){
  192.         this.titular = titular;
  193.     }
  194.  
  195.     public String getTitular(){
  196.         return titular;
  197.     }
  198.  
  199.     public void saca(double valor){
  200.         if(valor > 0 && saldo >= valor){
  201.             saldo -= valor;
  202.         }
  203.     }
  204.  
  205.     public void deposita(double valor){
  206.         if(valor>0){
  207.             saldo += valor;
  208.         }
  209.     }
  210.  
  211.     public double getSaldo(){
  212.         return saldo;
  213.     }
  214.  
  215. }COPIAR CÓDIGO
  216. Perceba que as lógicas de saque e depósito estão representados dentro da classe e além disso nosso setSaldo() deixa de fazer sentido para o usuário da Conta. A maneira de interagir com o saldo é sempre via uma das operações anteriores:
  217.  
  218. Conta conta = new Conta();
  219. conta.setTitular("Fábio");
  220. conta.deposita(100.0);
  221.  
  222. double valorSaque = 50.0;
  223. conta.saca(valorSaque);
  224.  
  225. double valorDeposito = 70.0;
  226. conta.deposita(valorDeposito)COPIAR CÓDIGO
  227. Muito melhor não é mesmo? Nada de duplicações de código por aí e muito menos outras classes controlando o estado da nossa Conta como tínhamos anteriormente.
  228.  
  229. Conclusão
  230. Setters e Getters devem ser usados com cautela e nem todos os atributos privados precisam ter expostos esses dois métodos com riscos de cairmos em um modelo anêmico que tem os seus comportamentos controlados por outras classes.
Add Comment
Please, Sign In to add comment