Java 9のモジュールシステムとは?モジュールの主な特徴と基本ルールを解説
Java 9における「モジュール」とは
Java 9で導入されたモジュール(Module)とは、コード・データ・リソースをひとまとめにした集合体のことです。具体的には、クラス、抽象クラス、インターフェースといった関連性のあるパッケージや型と、それらを構成するデータファイルや静的リソースを、論理的な単位としてグループ化したものを指します。
モジュールシステム(Project Jigsaw)により、Javaアプリケーションはこれまでよりも明確な依存関係管理と強力なカプセル化を実現できるようになりました。
モジュールの主な特徴
- 他のモジュールと通信するためのインターフェースを定義しなければなりません。
- モジュールインターフェースとモジュール実装の境界(分離)を明確に定義します。
- 情報を含む一連のプロパティを外部に提示します。
- 複数のモジュールをネスト(入れ子)して組み合わせることができます。
- 各モジュールは明確で単一の責務を持ちます。1つの機能は必ず1つのモジュールだけが実装します。
- 他のモジュールから独立してテスト可能である必要があります。
- あるモジュール内で発生したエラーが、他のモジュールへ波及しないように設計されます。
モジュール間の依存関係の基本ルール
ここで、M1 と M2 という2つのモジュールを例に考えます。M2 内にあるパッケージ Pkg2 を、モジュール M1 から利用できるようにしたい場合、以下の条件を満たす必要があります。
- M1 が M2 に依存する場合: モジュール M1 の宣言内で
requiresキーワードを使い、「モジュール M2 が必要である」ことを指定します。 - M2 側の公開設定: モジュール M2 は、依存しているモジュールから利用できるよう、パッケージ Pkg2 をエクスポートする必要があります。M2 の宣言内で
exportsキーワードにより「Pkg2 を公開する」ことを指定します。
記述例:module-info.java
これらの宣言は、各モジュールのルートに配置される module-info.java ファイルに記述します。上記の例では次のようになります。
// モジュール M1 の module-info.java
module M1 {
requires M2;
}
// モジュール M2 の module-info.java
module M2 {
exports pkg2;
}
このように requires と exports を組み合わせることで、必要最小限のパッケージだけを公開し、それ以外の内部実装を厳密に隠蔽できます。これがJava 9モジュールシステムによるカプセル化の核心であり、大規模アプリケーションの保守性とセキュリティ向上に大きく貢献します。
-
Java 9におけるCompletableFuture APIの主な改善点を徹底解説
CompletableFuture APIは、Javaにおける非同期(asynchronous)プログラミングのための仕組みです。このAPIを使うことで、main()スレッドとは別のスレッド上でタスクを実行し、その進行状況・完了・失敗をmain()スレッドへ通知できるため、ノンブロッキングなコードを記述できます。 Java 9では、このCompletableFuture APIに対して以下の3つの改善が導入されました。 タイムアウトと遅延のサポート サブクラス化サポートの強化 新しいファクトリメソッドの追加 1. タイムアウトと遅延のサポート orTimeout() メソッド public
-
Java 9におけるtry-with-resourcesの改善点とは?
try-with-resourcesとはtry-with-resourcesはJava 7で導入された機能で、使用し終えたリソースを自動的にクローズ(解放)することを目的としています。ただし、従来の仕様には制限があり、リソースはtry文の前、またはtryブロック内で宣言されている必要がありました。この条件を満たさない場合、コンパイルエラーが発生します。Java 9ではtry-with-resourcesが改善され、tryブロック内でオブジェクトを新たに宣言する必要がなくなりました。これにより、事前に宣言済みの変数やfinal相当の変数をそのままtry-with-resourcesに渡せるように