Aperfeiçoamento de Código - Curso FJ11

Olá a todos,

   Estou começando no mundo java através dos cursos da Caelum, onde terminei a duas semanas atrás o curso FJ11. Estou estudando a apostila e resolvi através dos videos da Alura modificar um pouco os exercícios, onde me deparei com a seguinte dúvida:

1-) Criei as classes:
1.1-) Clientes com dois atributos (nome, cpf) com Getters e Setters.

1.2-) Conta (com baixo acoplamento, sendo mais genérica possível)
package br.com.caelum.contas.modelo;

public class Conta {

private Cliente titular = new Cliente();
private int numero;
private int agencia;
private double saldo;


public int getNumero() {
	return this.numero;
}

public void setNumero(int numero) {
	this.numero = numero;
}

public int getAgencia() {
	return this.agencia;
}

public void setAgencia(int agencia) {
	this.agencia = agencia;
}

public double getSaldo() {
	return this.saldo;
}
	
public String getTitular() {
	return this.titular.getNome();
}

public void setTitular(String nome) {
	this.titular.setNome(nome);
}


public void saca(double valor) {
	this.saldo -= valor;
}

public void deposita(double valor) {
	this.saldo += valor;
}

public void transfere(double valor, Conta destino) {
	this.saca(valor);
	destino.deposita(valor);
}

}

 1.3-) ContaCorrente  (Esta classe implementa a chamada dos métodos da mãe)

package br.com.caelum.contas.modelo;

import br.com.caelum.contas.modelo.OperacoesContaCorrente;

public class ContaCorrente extends Conta {

private boolean concluido;
private OperacoesContaCorrente occ = new OperacoesContaCorrente(); 

public boolean concluido() {
	return this.concluido;
}

@Override
public void saca(double valor) {

	if(occ.analisaSaldoParaSaque(valor, contacorrente)) {
		super.saca(valor);
		System.out.println(occ.getMensagem());			
	} else {
		System.out.println(occ.getMensagem());
	}
}

@Override
public void deposita(double valor) {
	
	if(occ.analisaValorDaOperacao(valor)) {
		super.deposita(valor);
		System.out.println(occ.getMensagem());
	} else {
		System.out.println(occ.getMensagem());
	}
}

}
O método deposita() está funcionando. O meu problema está no método saca(), pois como ele está fazendo polimorfismo e tem apenas um parâmetro (double valor) igual a da classe “Conta” eu quis fazer um teste criando uma classe para analisar as operações da conta corrente, chamada de “OperacoesContaCorrente” que irá verificar se há saldo para fazermos a operação de sacar da conta corrente. Não sei se estou pensando da maneira correta, pois não consigo através da classe “ContaCorrente” passar a referencia correta que eu criei na classe que tem o void main.

1.4-) OperacoesContaCorrente

package br.com.caelum.contas.modelo;

public class OperacoesContaCorrente {

private boolean concluido;
private String mensagem;

public String getMensagem() {
	return this.mensagem;
}

public boolean analisaSaldoParaSaque(double valor, Conta conta) {
	
	this.concluido = false;
	
	if(conta.getSaldo() > valor && analisaValorDaOperacao(valor)) {
		this.concluido = true;
		this.mensagem = "Operação efetuada com sucesso...";
	} else {
		this.mensagem = "Sua operação não pode ser efetivada. Favor verificar o seu saldo ou o valor digitado...";
	}
	
	return concluido;
}

public boolean analisaValorDaOperacao(double valor) {
	
	this.concluido = false;
	
	if(valor > 0) {
		this.concluido = true;
		this.mensagem = "Operação efetuada com sucesso...";
	} else {
		this.mensagem = "Sua operação não pode ser efetivada. Favor verificar o valor digitado...";
	}
	
	return concluido;
}

}

O método que estou com problema aqui é o analisaSaldoParaSaque(double valor, Conta conta)

Alguém pode me ajudar

Segue abaixo a classe do void main

1.5-) TestaConta

package br.com.caelum.contas.main;

import br.com.caelum.contas.modelo.Conta;
import br.com.caelum.contas.modelo.ContaCorrente;

public class TestaConta {

public static void main(String[] args) {
	
	Conta contacorrente = new ContaCorrente() ;

	contacorrente.setTitular("Marcelo");
	contacorrente.setAgencia(140);
	contacorrente.setNumero(123456);
	contacorrente.deposita(100);
	
	
	System.out.println("Cliente.........: " + contacorrente.getTitular());
	System.out.println("Agencia.........: " + contacorrente.getAgencia());
	System.out.println("Conta Corrente..: " + contacorrente.getNumero());		
	System.out.println("Saldo...........: " + contacorrente.getSaldo());
	
	System.out.println();
	System.out.println();
	
	contacorrente.saca(20);
	System.out.println("Saldo...........: " + contacorrente.getSaldo());

}

}

Meu teste não tem a finalidade de dizer o que é certo ou errado, apenas entender através de erros e acertos onde poderei chegar.

Obrigado pela ajuda

Você tem 2 opções.

  1. No caso o objeto Conta é o próprio objeto chamador, portanto a chamada ficaria assim:
occ.analisaSaldoParaSaque(valor, this);
  1. Você pode também mudar o valor para receber o saldo.
occ.analisaSaldoParaSaque(valor, getSaldo());

Tudo bem Rodrigo,

Meu brother, eu não sei se choro mas tenho certeza de uma coisa, você é fora da curva. Muito obrigado, pois você não apenas me ajudou a resolver o problema mas também me mostrou como entender o conceito da keyword "this".
Muito Obrigado,

Meu brother, eu não sei se choro mas tenho certeza de uma coisa, você é fora da curva. Muito obrigado, pois você não apenas me ajudou a resolver o problema mas também me mostrou como entender o conceito da keyword “this”. Muito Obrigado,

1 curtida