É bem comum no desenvolvimento de aplicações Java termos injeções de dependências de uma mesma bean em diferentes locais e em muitas vezes em relações entre beans como nos exemplos abaixo:
@Service
@RequiredArgsConstructor
public class PersonUpdater {
private final PersonValidator validator;
private final DocumentService documentService; //outras utilizações no fluxo de atualização
public Person toUpdate(final Person person) {
validator.validate(person);
//...fluxo de atualização de pessoa
return person;
}
}
@Component
@RequiredArgsConstructor
public class PersonValidator {
private final DocumentService documentService;
public void validate(final Person person) {
if (person.isAdult() && person.isMale()) {
final var documents = documentService.getMilitaryDocuments(person.getId());
//validações necessárias
}
}
}
A bean DocumentService foi injetada tanto em PersonUpdater como em PersonValidator. Na PersonUpdater a bean pode ser utilizado para outros fluxos da atualização, porém, na PersonValidator a bean será APENAS utilizada para a busca de documentos militares QUANDO for a atualização de uma pessoa do gênero masculino e maior de idade. Uma possibilidade de ter o mesmo resultado são os exemplos abaixo:
@Service
@RequiredArgsConstructor
public class PersonUpdater {
private final PersonValidator validator;
private final DocumentService documentService; //outras utilizações no fluxo de atualização
public Person toUpdate(final Person person) {
validator.validate(person, () -> documentService.getMilitaryDocuments(person.getId()));
//...fluxo de atualização de pessoa
return person;
}
}
@Component
@RequiredArgsConstructor
public class PersonValidator {
public void validate(final Person person,
final Supplier<List<Document>> documentsSupplier) {
if (person.isAdult() && person.isMale()) {
final var documents = documentsSupplier.get();
//validações necessárias
}
}
}
Com as Interfaces Funcionais, abre-se um leque de opções de utilizações de comportamentos de uma aplicação Java! Elas flexibilizam a utilização via argumento de método (como no exemplo) e via atributo de alguma classe.
Além da injeção de dependência ser feito apenas em um local, temos:
- diminuir o acoplamento do validador
- aumentar a flexibilidade do método
Top comments (0)