今回も問題を解いていきましょう。
問題
次のモジュール宣言に関するコードについて考えます。このコードをコンパイルした際に正しく動作する選択肢はどれでしょうか?正しい選択肢を選んでください。
module com.example.myapp {
requires java.logging;
exports com.example.myapp.internal to java.base;
exports com.example.myapp.api;
}
選択肢
- A. exports句により、すべてのモジュールがcom.example.myapp.internalにアクセス可能
- B. com.example.myapp.internalはjava.baseだけがアクセス可能
- C. com.example.myapp.apiは他のモジュールからアクセスできない
- D. requires句によりjava.baseモジュールが必要とされる
答えと解説
回答を見る
答え
B. com.example.myapp.internalはjava.baseだけがアクセス可能
解説
解説のポイント:
- モジュールのexports句とは
- requires句の役割
基本説明
モジュールシステムはJava 9から導入された機能で、パッケージをモジュールという論理的な単位に分けて管理します。
exports
句は、他のモジュールがどのパッケージにアクセスできるかを示します。
この場合、com.example.myapp.internal
に対してはjava.base
モジュールだけがアクセスできるように制限されています。
誤答理由
Aの選択肢は誤りです。exports
にモジュール名が指定されている場合、そのモジュールだけがアクセス可能になります。
Cは明らかに誤っています。なぜならexports
句で指定されているため、他のモジュールからもアクセスが可能です。
Dの表現は不正確です。モジュールシステムではjava.base
は自動的に利用可能であり、requires
はjava.logging
に必要なことを示しています。
つまずきポイント
多くの受験者が混乱するのは、exports
句が持つ柔軟性です。
どのモジュールが特定のパッケージにアクセスできるかを宣言する際に、オプションでモジュール名を指定することができます。
また、他のオプションが適切に実装されていない場合にも興味深い例となることがあります。
発展知識
Javaのモジュールシステムを学ぶ際、基本的な構造にとどまらず、モジュールの相互運用性についても知識を深めることが重要です。
特にtransitive
キーワードについても理解を深めることが必要です。transitiveを使うと、他のモジュールに間接的に必要な依存関係も自動的に受け継ぐことができます。
これによりコードの再利用性を簡単に向上させることができます。