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;
}
Posts recentes
Componentes principais:
- module: Define o nome do módulo.
- requires: Declara a dependência de outros módulos.
- 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.