DEV Community

Igor Rudel
Igor Rudel

Posted on

Dica Java: Functional Interface #001

É 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;
    }
}
Enter fullscreen mode Exit fullscreen mode
@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
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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;
    }
}
Enter fullscreen mode Exit fullscreen mode
@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
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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

Heroku

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more