Palavra-chave provides

A palavra-chave provides em Java foi introduzida no Java 9 como parte do Java Platform Module System (JPMS), também conhecido como Project Jigsaw. Ela é usada para especificar quais serviços um módulo oferece para outros módulos.

O que faz a palavra-chave provides?

  • provides é usada em um módulo para declarar que ele fornece uma implementação de um serviço específico.
  • Isso permite que o módulo declare quais serviços ele está disponibilizando para outros módulos através da interface ServiceLoader.

Sintaxe básica:

Dentro do arquivo module-info.java, você usa provides para indicar a implementação de um serviço.

Exemplo:

Vamos supor que temos uma interface de serviço chamada Servico e uma classe que implementa essa interface chamada ServicoImpl. Você pode declarar no módulo que ServicoImpl é uma implementação do serviço Servico usando provides.





module com.exemplo.modulo {
    provides com.exemplo.Servico with com.exemplo.ServicoImpl;
}

Nesse exemplo:

  • provides com.exemplo.Servico: Declara que o módulo oferece um serviço do tipo Servico.
  • with com.exemplo.ServicoImpl: Especifica que a implementação desse serviço é a classe ServicoImpl.

Uso em contexto:

Definição de Interface de Serviço:

package com.exemplo;

public interface Servico {
    void executar();
}

Implementação do Serviço:

package com.exemplo;

public class ServicoImpl implements Servico {
    @Override
    public void executar() {
        System.out.println("Serviço executado!");
    }
}

Declaração no Módulo:

module com.exemplo.modulo {
    provides com.exemplo.Servico with com.exemplo.ServicoImpl;
}

Como usar:

  • Outros módulos podem usar a ServiceLoader para carregar a implementação fornecida.

Exemplo de uso do ServiceLoader:





import java.util.ServiceLoader;
import com.exemplo.Servico;

public class Main {
    public static void main(String[] args) {
        ServiceLoader<Servico> loader = ServiceLoader.load(Servico.class);
        for (Servico servico : loader) {
            servico.executar();
        }
    }
}

Quando usar provides:

  • Use provides quando você estiver criando um módulo que fornece implementações de serviços que outros módulos precisam usar.
  • Isso é particularmente útil em arquiteturas baseadas em plugins ou quando você deseja fornecer uma implementação concreta de um serviço para outros módulos.

O sistema de módulos de Java ajuda a modularizar e encapsular serviços, promovendo uma arquitetura mais limpa e modular.