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

Como invocar o ReajusteService Tendo um Construtor inicializando uma interface?

Prezado Rodrigo Boa tarde, Estou com dúvidas na inicialização das validações pelo Construtor no Reajuste Service:

private List<ValidacaoReajuste> validacoes;

public ReajusteService(List<ValidacaoReajuste> validacoes) {
    this.validacoes = validacoes;
}

Pelo que entendi, Se o projeto fosse Spring Boot, para fazer referência ao Service então eu criaria uma variável privada e faria injeção de dependência usando o @Autowired, e acredito que por alguma mágica do Java, a variável private List validacoes seria preenchida com as validações das classes que implementaram sua interface, é isso?

Digo isso, porque importei o projeto da Aula, criei as validações considerando a interface, e criei uma classe para teste, porém não consegui inicializar a chamada do ReajusteService(), e fazê-lo rodar as validações. Como seria a chamada do ReajusteService(), tendo como parâmetro uma lista de uma interface (List validacoes)?

segue o teste que fiz:

public class ExecutorService {

public static void main(String[] args) {
    Funcionario funcionario = new Funcionario("Pedro","1111111", Cargo.ESPECIALISTA, BigDecimal.valueOf(7000.00));

    ReajusteService service = new ReajusteService();
    service.reajustarSalarioDoFuncionario(funcionario, BigDecimal.valueOf(600.00));
    System.out.println(" Reajuste" + funcionario.getSalario());
 }

}

E caso essa interface ValidacaoReajuste possuir outros métodos com assinaturas diferentes, também funcionaria?

Atenciosamente, Geovane Lemos

2 respostas
solução!

Oi Geovane,

Para fins de testes no curso, sem utilizar frameworks e nem injecao de dependencias, seria algo assim:

Funcionario funcionario = new Funcionario("Pedro","1111111", Cargo.ESPECIALISTA, BigDecimal.valueOf(7000.00));

//aqui teria que criar manualmente a lista de validacoes para passar pro service:

List< ValidacaoReajuste> validacoes = new ArrayList<>();
validacoes.add(new ValidacaoPercentualReajuste());
validacoes.add(new ValidacaoPeriodicidadeEntreReajustes());

ReajusteService service = new ReajusteService(validacoes);
service.reajustarSalarioDoFuncionario(funcionario, BigDecimal.valueOf(600.00));

System.out.println(" Reajuste" + funcionario.getSalario());

Utilizando um framework, como o Spring, bastaria injetar a service com @Autowired, conforme você mencionou:

@Autowired
private ReajusteService reajusteService;

Porém, como a classe ReajusteService precisa receber a lista de validações no construtor, seria necessário a transformar em um componente do Spring e adicionar o @Autowired no construtor:

@Service
public class ReajusteService {

    private List<ValidacaoReajuste> validacoes;

    @Autowired
    public ReajusteService(List<ValidacaoReajuste> validacoes) {
        this.validacoes = validacoes;
    }

    //metodos...

}

O Spring vai sacar que ValidacaoReajuste é uma interface, então ele procura todas as classes que implementam essa interface e monta uma lista com elas automaticamente.

Bons estudos!

Rodrigo, Jóia !!! :)

Entendi perfeitamente, vou fazer os testes para fixar o conhecimento. Obrigado