Em um projeto Spring, seria viável a aplicação desse padrão strategy? Pergunto isso, pois há erro de ambiguidade quando a interface é implementada por 2 ou mais classes.
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Em um projeto Spring, seria viável a aplicação desse padrão strategy? Pergunto isso, pois há erro de ambiguidade quando a interface é implementada por 2 ou mais classes.
Oi Erivelton,
É possível sim no Spring, sendo que se apenas uma implementação da interface deve ser injetada, então você precisa usar o conceito de Qualifier Bean: https://www.baeldung.com/spring-qualifier-annotation
Também daria para injetar todas as implementações em uma lista:
@Autowired
private List<Imposto> impostos;
Bons estudos!
switch(tipoImposto) {
case ICMS:
return orcamento.getValor().multiply(new BigDecimal("0.1"));
case ISS:
return orcamento.getValor().multiply(new BigDecimal("0.06"));
default:
return BigDecimal.ZERO
}Fazendo um paralelo do Spring e com código acima que foram transformadas em implementações e supondo que fosse if, else if e else, teria alguma forma de definir explicitamente a implementação de acordo com o parâmetro vindo da requisição, como por exemplo: { "imposto": "ISS" }
Ou não sei se seria uma boa forma de implementar endpoints específicos para cada imposto e no controller definir o @Qualifier para a implementação específica da chamada do endpoint: GET .../orcamento/ICMS
@Component("icms")
public class ICMS implements TipoImposto{
public BigDecimal calcular(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.1"));
}
}@RestController
@RequestMapping("/orcamento/ICMS")
public class OrcamentoComICMSController{
@Qualifier("icms")
private TipoImposto tipoImposto;
}
GET .../orcamento/ISS
@Component("iss")
public class ISS implements TipoImposto{
public BigDecimal calcular(Orcamento orcamento) {
return orcamento.getValor().multiply(new BigDecimal("0.06"));
}
}@RestController
@RequestMapping("/orcamento/ISS")
public class OrcamentoComISSController{
@Qualifier("iss")
private TipoImposto tipoImposto;
}