Palavra-chave module

A palavra-chave module foi introduzida no Java 9 como parte do Java Platform Module System (JPMS), também conhecido como Project Jigsaw, que trouxe a modularização para o Java. Ela é usada para definir módulos, que são agrupamentos de pacotes e recursos em um sistema modular. Um módulo permite encapsular pacotes e controlar quais partes do código serão expostas a outros módulos.

Estrutura do módulo

Um módulo é definido usando um arquivo especial chamado module-info.java, que contém a palavra-chave module, o nome do módulo e uma lista de declarações, como requires e exports.

Sintaxe





module nome.do.modulo {
    // Declaração do que o módulo requer de outros módulos
    requires nome.outro.modulo;

    // Declaração dos pacotes exportados por este módulo
    exports nome.do.pacote;
}

Componentes principais:

  1. module: Define o nome do módulo.
  2. requires: Declara a dependência de outros módulos.
  3. exports: Expõe pacotes para serem acessíveis por outros módulos.

Exemplo de módulo

Vamos criar um módulo chamado com.exemplo.app e exportar um pacote.

Arquivo module-info.java:

module com.exemplo.app {
    exports com.exemplo.utilidades;
    requires com.exemplo.outroModulo;
}

Explicação:

  • O módulo com.exemplo.app exporta o pacote com.exemplo.utilidades, tornando-o acessível a outros módulos.
  • O módulo também declara que ele requer o módulo com.exemplo.outroModulo, ou seja, depende dele para funcionar.

Usos comuns de palavras-chave no contexto de módulos:

requires: Indica que o módulo atual depende de outro módulo para compilar ou executar.

requires java.sql;

exports: Indica quais pacotes dentro do módulo estão visíveis para outros módulos.

exports com.exemplo.servicos;

requires transitive: Indica que os módulos que dependem deste módulo também terão acesso transitivo ao módulo requerido.

requires transitive java.logging;

opens: Abre um pacote para reflexão, permitindo que ele seja acessado em tempo de execução, mas não durante a compilação.

opens com.exemplo.utilidades;

uses: Declara que o módulo usa um serviço.

uses com.exemplo.servico.MeuServico;

provides…with: Declara que o módulo fornece uma implementação para um serviço.

provides com.exemplo.servico.MeuServico with com.exemplo.implementacao.MeuServicoImpl;

Benefícios do sistema de módulos:

  • Melhor organização: Divide aplicações grandes em módulos menores, o que facilita a manutenção e a gestão.
  • Segurança e encapsulamento: Controla o acesso entre diferentes partes de uma aplicação, expondo apenas o que é necessário.
  • Carregamento mais eficiente: Somente os módulos requeridos são carregados.