モジュールシステム
コードをモジュールという単位で構成し、管理するための仕組みです。モジュールシステムは、大規模なアプリケーションの開発やライブラリの再利用を容易にし、依存関係の管理を強化することを目的としています。
1.モジュールシステムの基本概念
モジュール
モジュールは、クラスやパッケージをグループ化し、明確に定義された境界を持つ単位です。各モジュールは、他のモジュールに対して何を公開するか(エクスポートするか)を指定できるため、アクセス制御が可能です。
module-info.java
モジュールシステムの中心にあるのが、module-info.java というモジュール定義ファイルです。このファイルは、モジュールの名前、依存関係、およびエクスポートされるパッケージを定義します。module-info.java はモジュールのルートに配置されます。
2.module-info.javaの構造
module-info.javaの基本構造は次の通りです。
module com.example.module {
// このモジュールが依存する他のモジュール
requires java.base;
requires com.example.othermodule;
// このモジュールから外部に公開するパッケージ
exports com.example.module.api;
// 特定のモジュールに対してのみ公開するパッケージ
exports com.example.module.internal to com.example.specificmodule;
// サービスを提供するモジュール
provides com.example.service.MyService with com.example.module.MyServiceImpl;
// サービスを使用するモジュール
uses com.example.service.MyService;
}
主なキーワード
-
module: モジュールの名前を定義します。
-
requires: このモジュールが依存する他のモジュールを指定します。requires transitiveを使うと、そのモジュールをいぞんするモジュールに再エクスポートします。
-
exports: モジュールの外部に公開するパッケージを指定します。これにより、他のモジュールがそのパッケージにアクセスできるようになります。
-
exports ... to: 特定のモジュールにのみパッケージを公開するために使用します。
-
provides ... with: サービスを提供するクラスを指定します。Javaのサービスプロバイダインタフェースを使う場合に使用します。
-
uses: サービスを使用することを宣言します。
3.モジュールシステムのメリット
依存関係の明確化
モジュールシステムにより、依存関係が明確に定義され、どのモジュールがどの機能に依存しているかが簡単に追跡できます。これにより、モジュール間の結合度を下げ、システム全体の構造がわかりやすくなります。
強化されたカプセル化
パッケージをモジュールごとにエクスポートすることで、不要な部分を隠蔽し、外部からの不正アクセスを防止します。これにより。内部実装が外部に影響を与えにくくなります。
依存性の解決とコンパイルの高速化
モジュールシステムを使用すると、コンパイル時に必要なモジュールだけをコンパイルすることができるため、ビルド時間が短縮されます。また、ランタイム時に不要なモジュールがロードされないため。メモリ消費を抑えることができます。
4.モジュールシステムの使用例
基本的なモジュール定義
次に示すのは、基本的なモジュール定義の例です。
モジュールA: module-info.java
module com.example.moduleA {
requires java.sql;
exports com.example.moduleA.api;
}
モジュールB: module-info.java
module com.example.moduleB {
requires com.example.moduleA;
exports com.example.moduleB.api;
}
この例では、moduleAはjava.sqlに依存しており、moduleBはmoduleAに依存しています。moduleAはcom.example.moduleA.apiパッケージを公開しており、moduleBはcom.example.moduleB.apiパッケージを公開しています。