Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Não consigo chegar no resultado :(

Boa tarde, então estou treinando aqui no java, e não estou conseguindo chegar no meu resultado, vou postar meu codigo aqui primeiro fiz a class Endereco até aqui ta tudo certo.

package br.edu.bercalini.metodos;

public class Endereco {
    private String bairro;
    private int numeroCasa;
    public Endereco() {}
    public Endereco(String bairro, int numeroCasa) {
        this.bairro = bairro;
        this.numeroCasa = numeroCasa;
    }
    public String getBairro() {
        return bairro;
    }
    public void setBairro(String bairro) {
        this.bairro = bairro;
    }
    public int getNumeroCasa() {
        return numeroCasa;
    }
    public void setNumeroCasa(int numero) {
        this.numeroCasa = numero;
    }
    @Override
    public String toString() {
        return " seu bairro: " + getBairro() + " numero da casa: " + getNumeroCasa();
    }

}

E depois fiz a class Cliente como segue o código abaixo

package br.edu.bercalini.metodos;

public class Cliente {
    private String nome;
    private int idade;
    private ControleVendas venda = new ControleVendas();
    private Endereco endereco = new Endereco();
    public Cliente() {}
    public Cliente(Endereco endereco) {
        this.endereco = endereco;
    }
    public Cliente(String nome, int idade, Endereco endereco) {
        this.nome = nome;
        this.idade = idade;
        this.endereco = endereco;
    }
    public Cliente(ControleVendas controle) {
        this.venda = controle;
    }
    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public int getIdade() {
        return idade;
    }
    public void setIdade(int idade) {
        this.idade = idade;
    }
    @Override
    public String toString() {
        return "Nome cliente: " + getNome() + " " + "de " + getIdade() + " anos";
    }
    public Endereco getEndereco() {
        return endereco;
    }
    public void mostrarConta(Cliente c) {
        System.out.println("Você esta devendo: " +c.getVenda().valor);
    }
    public void pagarConta(double valor, Cliente pagador) {
        ControleVendas controle = new ControleVendas();

        if(valor >= controle.getValor()) {

        }
    }
    public ControleVendas getVenda() {
        return venda;
    }
    public void setVenda(ControleVendas venda) {
        this.venda = venda;
    }
 }

Até aqui também esta tudo bem, e depois fiz a class de Venda.

package br.edu.bercalini.metodos;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ControleVendas {
    protected double valor;
    private Cliente cliente;
    private List<ControleVendas> vendas = new ArrayList<>();
    public ControleVendas() {}
    public ControleVendas(Cliente cliente) {
        this.cliente = cliente;
    }
    public ControleVendas(double valor, Cliente cliente) {
        this.valor = valor;
        this.cliente = cliente;
    }
    public void venda(double valor, Cliente c) {
        setValor(valor);
        vendas.add(new ControleVendas(valor, c));
    }
    public void mostrarVendas() {
        for(ControleVendas controle: vendas) {
            System.out.println("[" + controle.cliente + "" + controle.cliente.getEndereco() + " " + 
                    "total compra: " + controle.valor + "]");
        }
    }
    public void setValor(double valor) {
        this.valor = valor;
    }
    public double getValor() {
        return valor;
    }
}

Estou conseguindo registrar minha conta no meu metodo venda até ai ta tudo bem, no meu main roda tudo certinho. porem queria fazer um metodo no minha class cliente que deseja retornar/mostrar valor que ele está devendo, e ja mudei tudo, e não consegui que o resultado e sempre me mostra o 0, vou colar meu código do main...

package br.edu.bercalini.main;

import br.edu.bercalini.metodos.Cliente;
import br.edu.bercalini.metodos.ControleVendas;
import br.edu.bercalini.metodos.Endereco;

public class Controle_vendas {

    public static void main(String[] args) {
      Endereco e1 = new Endereco();
      e1.setBairro("Testando");
      e1.setNumeroCasa(10);
      Cliente c1 = new Cliente(e1);
      c1.setNome("Teste");
      c1.setIdade(14);
      ControleVendas cv = new ControleVendas();
      cv.venda(4000, c1);
      cv.mostrarVendas();
      c1.mostrarConta(c1);
    }
}

[Nome cliente: Teste de 14 anos seu bairro: Testando numero da casa: 10 total compra: 4000.0]
Você esta devendo: 0.0

Como falado o resultado devedor não sai do 0 :(

3 respostas

Olá Alisson, tudo bom?

Primeiramente, sua classe ControleVendas possui o atributo valor com visibilidade protected entretanto você possui getter e setter para este atributo. Neste caso, não faria diferença tornar o atributo privado e utilizar os métodos getValor() e setValor() =)

Quanto ao valor estar apresentando 0, sua classe ControleVendas possui o construtor padrão e duas sobrecargas. Uma recebe valor e cliente:

    public ControleVendas(double valor, Cliente cliente) {

A outra recebe apenas cliente:

    public ControleVendas(Cliente cliente) {

Entretanto, na classe Cliente estamos adicionando um novo objeto do tipo ControleVendas com o construtor padrão. Logo, o atributo venda está com o valor default, um novo objeto do tipo ControleVendas:

    private ControleVendas venda = new ControleVendas();

Portanto, seu atributo venda, até o momento, está com um objeto cheio de atributos vazios. Por isso você está vendo sempre zero (valor padrão para o tipo double)! Tente popular seu atributo venda com um objeto do tipo ControleVendas já definido seguindo a sua lógica =) Essa é uma das forma de resolver o problema.

espero ter ajudado!

solução!

Opa, temos alguns problemas. O primeiro é você passar um cliente para o método mostrarConta que já está na classe Cliente. Essa é justamente a beleza da Orientação a Objetos, o estado já está junto do comportamento. Olha como ficaria:

 public void mostrarConta() {
        System.out.println("Você esta devendo: " +c.this.venda.valor);
    }

Você já pode acessar a venda do próprio objeto cliente :). Agora tem o outro problema, depois que esse cliente é instanciado, você nunca altera a venda dele e é por isso que o valor está sempre zero. Você pode alterar o método venda para ficar mais ou menos assim:

public void venda(double valor, Cliente c) {
        setValor(valor);
      ControleVendas venda =  new ControleVendas(valor, c)
        vendas.add(venda);
       c.setVenda(venda); //tem que criar esse método
    }

Dessa forma, você pode alterar a venda do cliente em questão. Talvez o código não seja o melhor, mas para esse momento vai fazer o seu exemplo funcionar e aí, depois, vc pode refletir mais.

Opa muito obrigado! eu mudei aqui e rodou, só que não entendi direito esse metodo venda. Você passo o valor e o cliente no argumento, até ai tudo bem, mais depois não entendi fazer uma instancia do tipo venda. Crio um construtor do tipo vendo que recebe o valor, e o cliente, e depois você adicionar a venda? E depois vc seta o venda?