4
respostas

Duvida no Exercicio Venda Casada

Criei 2 formas de implementar o exercicio, a primeira igual a resposta do exercicio, deu tudo certo, mas outra eu implementei uma lista de itens de venda casada em vez de comparar com String Caneta, Lapis, mas não deu certo, alguém pode ver onde eu errei.

Classe Desconto por venda casada, que acho que esta o erro.

// ta retornando 0.0 na classe TestaDesconto2 // ta retornando false no metodo DescontoPorVendaCasada2.existeItens(Orcamento orcamento);

package br.com.Alura.Design_Pattern;

import java.util.List;

public class DescontoPorVendaCasada2 implements Desconto2 {

    private Desconto2 proximo;

    List<Item> listaItensVendaCasada = ItensVendaCasada.getItensVendaCasada();

    @Override
    public double calcula(Orcamento orcamento) {
        if (existeItens(orcamento)) {
            return orcamento.getValor() * 0.05;
        } else {
            return proximo.calcula(orcamento);
        }
    }

    private boolean existeItens(Orcamento orcamento) {
        if(listaItensVendaCasada.containsAll(orcamento.getItens())) {
            System.out.println("Encontrou");
            return true;
        }
        System.out.println("nao encontrou");
        return false;
    }

    @Override
    public void setProximo(Desconto2 proximo) {
        this.proximo = proximo;

    }

}

Essa é a lista de venda Casada, classe auxiliar que criei para guardar a lista de itens de venda casada.

package br.com.Alura.Design_Pattern;

import java.util.ArrayList;
import java.util.List;

public class ItensVendaCasada {

    private static List<Item> itensVendaCasada = new ArrayList<Item>();

    public void adicionaItem(Item item) {
        itensVendaCasada.add(item);
    }

    public static List<Item> getItensVendaCasada() {
        return itensVendaCasada;
    }

}

Calculadora de desconto

package br.com.Alura.Design_Pattern;

public class CalculadorDeDescontos2 {

    public double calcula(Orcamento orcamento) {
        Desconto2 d1 = new DescontoMaisDeCincoItens2();
        Desconto2 d2 = new DescontoValorMaiorQueQuinhentosReais2();
        Desconto2 d3 = new DescontoPorVendaCasada2();
        Desconto2 d4 = new SemDesconto2();

        d1.setProximo(d2);
        d2.setProximo(d3);
        d3.setProximo(d4);

        return d1.calcula(orcamento);

    }

}

Classe Testa desconto

package br.com.Alura.Design_Pattern;

public class TestaDesconto2 {
    public static void main(String[] args) {

        CalculadorDeDescontos2 calculadoraDesconto = new CalculadorDeDescontos2();

        Orcamento orcamento = new Orcamento(500.0);

        // adiciona itens na lista de venda casada
        ItensVendaCasada itensVendaCasada = new ItensVendaCasada();
        itensVendaCasada.adicionaItem(new Item("Lapis", 250.0));
        itensVendaCasada.adicionaItem(new Item("Caneta", 250.0));

        orcamento.adicionaItem(new Item("Lapis", 250.0));
        orcamento.adicionaItem(new Item("Caneta", 250.0));


        double desconto = calculadoraDesconto.calcula(orcamento);

        System.out.println(desconto);
        // ta retornando 0.0

    }

}

Classe item, que implementei um compareTo() pelo nome

package br.com.Alura.Design_Pattern;

public class Item implements Comparable<Item>{
    private String nome;
    private double valor;



    public Item(String nome, double valor) {
        this.nome = nome;
        this.valor = valor;
    }

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }
    public double getValor() {
        return valor;
    }
    public void setValor(double valor) {
        this.valor = valor;
    }
    @Override
    public int compareTo(Item o) {
        return this.getNome().compareTo(o.getNome());
    }



}

Interface

package br.com.Alura.Design_Pattern;

public interface Desconto2 {

    double calcula(Orcamento orcamento);
    void setProximo(Desconto2 proximo);

}
4 respostas

Bom, tem bastante código.. um que me chamou a atenção é esse aqui:

private boolean existeItens(Orcamento orcamento) {
        if(listaItensVendaCasada.contains(orcamento.getItens())) {
            System.out.println("Encontrou");
            return true;
        }
        System.out.println("nao encontrou");
        return false;
    }

você roda o contains passando uma lista, sendo que vc tem um List e não um List>. Pode ser que esteja aí.

Não entendi sua resposta, mas as duas classes envolvidas estão implementando um ArrayList de Item

Depois de quebrar a cabeça um monte, lembrei que não tinha sobrescrito o metodo equals na classe item, comparando pelo nome do item

@Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Item)) {
            return false;
        }else {
            Item outro = (Item) obj;
            return outro.getNome().equals(this.getNome());
        }
    }

Deu certo Valeu !

Foi solucionada então sua dúvida Alexandre ? Se sim você poderia marcar o tópico como resolvido.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software