2
respostas

Problemas com Decorator nos Impostos ICPP e IKCV

Fala galera,

Eu estou com um problema na hora de usar o Decorator nas classes ICPP e IKCV. Não estou conseguindo fazer o calculo composto com elas porque o atributo outroImposto sempre vem null. Eu não consegui identificar o motivo, então estou postando s códigos aqui para me ajduarem.

public abstract class TemplateDeImpotoCondicional extends Imposto {

    private static Imposto outroImposto;

    public TemplateDeImpotoCondicional(Imposto outrImpoto) {
        super(outroImposto);
    }

    public TemplateDeImpotoCondicional() {}

    @Override
    public double calcula(Orcamento orcamento) {
        if (deveUsarMaxTaxacao(orcamento))
            return maximaTaxacao(orcamento) + calculoDoOutroImposto(orcamento);
        else
            return minimaTaxacao(orcamento) + calculoDoOutroImposto(orcamento);
    }



    public abstract boolean deveUsarMaxTaxacao(Orcamento orcamento);

    public abstract double minimaTaxacao(Orcamento orcamento);

    public abstract double maximaTaxacao(Orcamento orcamento);


}

public class IKCV extends TemplateDeImpotoCondicional {

    public IKCV() {}

    public IKCV(Imposto outrImpoto) {
        super(outrImpoto);
    }

    private boolean temItemMaiorQueCemReiasNo(Orcamento orcamento) {
        for (Item item : orcamento.getItens()) {
            if (item.getValor() > 100) return true;
        }
        return false;
    }

    @Override
    public boolean deveUsarMaxTaxacao(Orcamento orcamento) {
        return orcamento.getValor() > 100 && temItemMaiorQueCemReiasNo(orcamento);
    }

    @Override
    public double minimaTaxacao(Orcamento orcamento) {
        return orcamento.getValor() * 0.06;
    }

    @Override
    public double maximaTaxacao(Orcamento orcamento) {
        return orcamento.getValor() * 0.10;
    }
}

public class ICPP extends   TemplateDeImpotoCondicional {

    public ICPP() { }

    public ICPP(Imposto outrImpoto) {
        super(outrImpoto);
    }

    @Override
    public double minimaTaxacao(Orcamento orcamento) {
        return orcamento.getValor() * 0.05;
    }

    @Override
    public double maximaTaxacao(Orcamento orcamento) {
        return orcamento.getValor() * 0.07;
    }

    @Override
    public boolean deveUsarMaxTaxacao(Orcamento orcamento) {
        return orcamento.getValor() > 500;
    }
}

public abstract class Imposto {

    protected Imposto outroImposto;

    public Imposto(Imposto outroImposto) {
        this.outroImposto = outroImposto;
    }

    public Imposto() {}

    public abstract  double calcula(Orcamento orcamento);

    protected double calculoDoOutroImposto(Orcamento orcamento) {
        if (this.outroImposto != null)
            return outroImposto.calcula(orcamento);

        return 0;
    }
}

public class TesteDeImpostosComplexos {

    public static void main(String[] args) {
        Imposto ikcv = new IKCV(new ICPP());

        Orcamento orcamento = new Orcamento(500);

        double valor = ikcv.calcula(orcamento);

        System.out.println(valor);

    }

}
2 respostas

Opa, três coisas: o imposto não deve ser static. A segunda é que eu não vi algum lugar usando a variável => outroImposto da classe TemplateYYY...

A terceira, e talvez mais importante :). Precisamos da pilha da exception, para tentar achar mais facilmente o erro.

Oi Rodrigo além do que já foi escrito, deixe a classe abstrata assim:

public abstract class Imposto {

          private final Imposto outroImposto;
          public Imposto(Imposto outroImposto) {
              this.outroImposto = outroImposto;
          }

          public Imposto() {
              outroImposto = null;
          }

          protected double calculaOutroImposto(Orcamento orcamento) {
              return (outroImposto == null? 0 : outroImposto.calcula(orcamento));
          }

          public abstract double calcula(Orcamento orcamento);
      }

Espero ter ajudado e bons estudos.