MENU

【Java Silver】モジュールの宣言とモジュール間のアクセス

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が伝播的に必要であることを示せます。

この仕組みによって依存関係が明確化され、管理の容易さとメンテナンス性が向上します。

目次