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

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay