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

Implementação do strategy via Enum

Durante a aula, logo quando foi explicado o problema, eu pausei o video e fiz essa implementação, colocando o calculo dentro de cada enum. Essa seria uma possível variação da implementação do do Strategy, ou existe algum problema em implementar dessa maneira?

public class TestFluxo {

    public static void main(String[] args) {

        Orcamento orcamento = new Orcamento(new BigDecimal("10.000"));
        CalculadoraDeImpostoImpl calculadoraDeImposto = new CalculadoraDeImpostoImpl();
        System.err.println(calculadoraDeImposto.calcula(orcamento, TipoImpostoEnum.COFINS));
        System.err.println(calculadoraDeImposto.calcula(orcamento, TipoImpostoEnum.ICMS));
        System.err.println(calculadoraDeImposto.calcula(orcamento, TipoImpostoEnum.ISS));

    }

}
public class CalculadoraDeImpostoImpl {

    public BigDecimal calcula(Orcamento orcamento, TipoImpostoEnum imposto) {
        return imposto.calcula(orcamento);
    }

}
public class Orcamento {

    public Orcamento(BigDecimal valor) {
        this.valor = valor;
    }

    private BigDecimal valor;

    public BigDecimal getValor() {
        return this.valor;
    }

}
public enum TipoImpostoEnum {

    ICMS() {
        @Override
        BigDecimal calcula(Orcamento orcamento) {
            return orcamento.getValor().multiply(new BigDecimal("0.3"));
        }
    },
    ISS() {
        @Override
        BigDecimal calcula(Orcamento orcamento) {
            return orcamento.getValor().multiply(new BigDecimal("0.10"));
        }
    },
    COFINS() {
        @Override
        BigDecimal calcula(Orcamento orcamento) {
            return orcamento.getValor().multiply(new BigDecimal("0.5"));
        }
    };

    abstract BigDecimal calcula(Orcamento orcamento);

}
4 respostas
solução!

Oi Maxwel,

Bacana! Esse é conhecido como Strategy Enum, sendo uma boa alternativa também.

Bons estudos!

Olá Maxwel,

Entendo que sua implementação mantém o código funcionando normalmente e elimina a necessidade de criar classes para cada variação de calculo, mas acredito que o ideal é manter as regras de negócio em suas respectivas classes, pois a finalidade do Enum é ser uma coleção de contantes e não de dados que devem ou podem ser alterados.

É apenas uma questão de boa prática quanto a utilização de Enums.

Att,

Valeu pela dica Guilherme, abraço

Imagina Maxwel...

Obrigado você por compartilhar sua implementação.

E obrigado também Rodrigo comentar sobre o padrão Strategy Enum, eu não o conhecia.