Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida de Java modernoso

Na aula 2 não entendi como o argumento EmailService::new é passado para parâmetro de tipo ServiceFactory<T> factory, onde:

public interface ServiceFactory<T> {
    ConsumerService<T> create();
}

Contexto:

new ServiceRunner(EmailService::new).start(5);

    public ServiceRunner(ServiceFactory<T> factory) {
        this.provider = new ServiceProvider<>(factory);
    }

Acho que tem relação com alguma questão de ser uma interface de um método só... mas também é confuso pq parece que o generics sumiu (ou não foi usado).

Grato!

1 resposta
solução!

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.