Olá, Leonardo
Tudo bem?
Você está certo ao pensar que tem relação com a interface de um método só. Isso é o que chamamos de "interface funcional" em Java. Interfaces funcionais podem ser usadas como alvos para expressões lambda e referências de método.
No seu caso, a interface ServiceFactory<T>
é uma interface funcional porque tem apenas um método abstrato: create()
. Aqui está a definição da interface para relembrar:
public interface ServiceFactory<T> {
ConsumerService<T> create();
}
Quando você passa EmailService::new
para o construtor de ServiceRunner
, você está passando uma referência de método que corresponde ao método create()
da interface ServiceFactory<T>
.
O que isso significa na prática é que EmailService::new
é uma referência ao construtor de EmailService
. Então, quando o método create()
for chamado, ele vai criar uma nova instância de EmailService
.
Aqui está como isso se encaixa no código que você forneceu:
new ServiceRunner(EmailService::new).start(5);
public ServiceRunner(ServiceFactory<T> factory) {
this.provider = new ServiceProvider<>(factory);
}
Quando você faz new ServiceRunner(EmailService::new)
, você está dizendo que ServiceFactory<T>
deve usar o construtor de EmailService
para criar novas instâncias. O tipo genérico T
é inferido automaticamente pelo compilador com base no contexto em que ServiceFactory
é usado.
Para deixar mais claro, aqui está um exemplo prático:
public class EmailService implements ConsumerService<String> {
// Construtor
public EmailService() {
// Inicialização
}
// Implementação dos métodos de ConsumerService
}
public class Main {
public static void main(String[] args) {
ServiceRunner<EmailService> runner = new ServiceRunner<>(EmailService::new);
runner.start(5);
}
}
Neste exemplo, EmailService::new
é passado para ServiceRunner
, que espera um ServiceFactory<EmailService>
. O ServiceFactory
então usa EmailService::new
para criar novas instâncias de EmailService
.
Espero ter ajudado. Qualquer dúvida manda aqui. Bons estudos.