Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Remover if do codigo

Neste artigo: https://www.alura.com.br/artigos/reduzindo-de-n-ifs-para-nenhum-com-strategy-em-java

O autor remove os IFS no enum, com a intreface chamando apenas 1 método. Mas, se na interface tivessemos 4 métodos? Como ficaria a implementação no enum?

4 respostas

Olá, Hoiama.

Cada método ficaria um depois do outro, como se fosse dentro de uma classe normal. Abaixo coloquei a implementação para o ATENDENTE como os métodos normais, e depois coloquei de uma maneira reduzida , como o instrutor fez no texto.

package br.com.bytebank.banco.modelo;

public enum Cargo implements Comissao {

    ATENDENTE {
        @Override public double calculaComissao(double valor) {
            return valor * 0.1;
        }

        @Override public double teste1(Object a) {
            return 0;
        }

        @Override public double teste2(Object b) {
            return 0;
        }

        @Override public double teste3(Object c) {
            return 0;
        }
    },

    VENDEDOR {
        @Override public double calculaComissao(double valor) { return valor * 0.15 + 5; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    },

    GERENTE { 
        @Override public double calculaComissao(double valor) { return valor * 0.20 + 10; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }

    },

    AJUDANTE { 
        @Override public double calculaComissao(double valor) { return valor * 0.08 + 1; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    },

    RECEPCIONISTA {
        @Override public double calculaComissao(double valor) { return valor * 0.05; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    },

    DIRETOR {
        @Override public double calculaComissao(double valor) { return valor * 0.25 + 20; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    };
}

Entendi. Mas, não seria, digamos, "feio" essa forma? Por exemplo, no diretor, se eu fosse usar só o teste3. Os outros não seriam para usar no diretor.

Se a interface Comissao definir esses 4 métodos, todos cargos precisam ter uma implementação para eles, a menos que você use o modificador "default" na interface e criar uma implementação padrão para toda classe que não queira alterar.

Então a intereface ficaria:

public interface Comissao {
    default public double calculaComissao(double valor) {return 5;}    
    default public double teste1(Object a) { return 1; }
    default public double teste2(Object b) { return 2; }
    public double teste3(Object c);
}

Dessa forma, apenas o método "teste3" será obrigatório ter um método sobrescrevendo, enquanto os outros são apenas opcionais a sobrescrita.

package br.com.bytebank.banco.modelo;

public enum Cargo implements Comissao {

    ATENDENTE {
        @Override public double calculaComissao(double valor) { return valor * 0.1; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    },

    VENDEDOR {
        @Override public double calculaComissao(double valor) { return valor * 0.15 + 5; }
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    },

    GERENTE { 
        @Override public double calculaComissao(double valor) { return valor * 0.20 + 10; }
        @Override public double teste1(Object a) { return 0; }
        @Override public double teste3(Object c) { return 0; }

    },

    AJUDANTE { 
        @Override public double calculaComissao(double valor) { return valor * 0.08 + 1; }
        @Override public double teste3(Object c) { return 0; }
    },

    RECEPCIONISTA {
        @Override public double teste2(Object b) { return 0; }
        @Override public double teste3(Object c) { return 0; }
    },

    DIRETOR {
        @Override public double teste3(Object c) { return 0; }
    };
}

Entendi. Porém, não consegui fazer usando o feign, para pegar o retorno de um microserviço.

@GetMapping(path = "/buscar")
    String buscarServico(@RequestParam("ab") String ab,
            @RequestParam("cd") String cd);

Como ficaria nesse caso? O default?