Javaのモジュールシステムを理解するために、次の問題に挑戦してみましょう。
問題
以下のモジュールが正しく宣言されている場合、com.example.application
モジュールがcom.example.utils
モジュールのパッケージutils
へのアクセスを得るために必要な宣言はどれでしょうか?
// com.example.utils module-info.java
module com.example.utils {
exports com.example.utils;
}
// com.example.application module-info.java
module com.example.application {
// ここに適切な宣言を追加してください
}
選択肢
- A. requires com.example.utils;
- B. import com.example.utils;
- C. uses com.example.utils;
- D. grants com.example.utils;
答えと解説
回答を見る
答え
A. requires com.example.utils;
解説
基本説明:
Java 9から導入されたモジュールシステムは、アプリケーションの構造を明確にし、セキュリティとパフォーマンスを向上させるための仕組みです。
モジュールの宣言はmodule-info.java
ファイルで行います。
問題のコードでは、com.example.application
モジュールがcom.example.utils
モジュールを利用するために、requires
句を使用してモジュールの依存関係を宣言します。
つまり、他のモジュールから特定のモジュールのパッケージにアクセスするには、「requires moduleName」という形式で依存関係を宣言します。
誤答理由:
Bのimport
はパッケージやクラスをインポートするために使用され、モジュールの宣言とは異なります。
Cのuses
はサービスプロバイダを使用するための宣言に利用されるため、パッケージやモジュールのアクセス権とは関係がありません。
Dのgrants
というキーワードは存在しません。
つまずきポイント:
モジュールシステムの学習ではキーワードとその使用方法が混同しやすいです。
特にrequires
は頻繁に使われるため明確に理解し、正確に利用することが重要です。
また、モジュールの概念が新しい方にとっては、今までのimport
との違いがわからなくなることがあります。
発展知識:
モジュールシステムを活用することで、ライブラリの無駄なマージを避けつつ、必要な部分のみを利用できるようになります。
例えば、transitive
を用いることでモジュールBがモジュールCに依存する際、モジュールAがBを直接使用していなくても、AにはCが伝播的に必要であることを示せます。
この仕組みによって依存関係が明確化され、管理の容易さとメンテナンス性が向上します。