MENU

【Java Silver】モジュール型JDKとモジュールの基礎

今回も問題を解いていきましょう。

問題

次のモジュール宣言に関するコードについて考えます。このコードをコンパイルした際に正しく動作する選択肢はどれでしょうか?正しい選択肢を選んでください。

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は自動的に利用可能であり、requiresjava.loggingに必要なことを示しています。

つまずきポイント

多くの受験者が混乱するのは、exports句が持つ柔軟性です。

どのモジュールが特定のパッケージにアクセスできるかを宣言する際に、オプションでモジュール名を指定することができます。

また、他のオプションが適切に実装されていない場合にも興味深い例となることがあります。

発展知識

Javaのモジュールシステムを学ぶ際、基本的な構造にとどまらず、モジュールの相互運用性についても知識を深めることが重要です。

特にtransitiveキーワードについても理解を深めることが必要です。transitiveを使うと、他のモジュールに間接的に必要な依存関係も自動的に受け継ぐことができます。

これによりコードの再利用性を簡単に向上させることができます。

目次