モジュールシステムは、Java 9 以降で導入された機能です。今回はモジュールに関する基礎問題を解いてみましょう。
問題
次のモジュールプロジェクトを正しくコンパイルして実行した場合の出力はどれでしょうか?正しい選択肢を選んでください。
// module-info.java
module hello {
exports com.example;
}
// Hello.java
package com.example;
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
選択肢
- A. Hello, World!
- B. モジュールエラー
- C. コンパイルエラー
- D. 実行時エラー
答えと解説
回答を見る
答え
A. Hello, World!
解説
解説のポイント:
- 基本説明
- 誤答理由
- つまずきポイント
- 発展知識
基本説明:
Javaのモジュールシステムは、大規模なアプリケーションをより効率的に管理するために導入されました。
モジュールとは、パッケージの集合を規定し明確な境界を持たせることで、プロジェクトの依存性を簡潔に示すことができます。
今回のコードにはモジュール設定ファイル「module-info.java」が利用されています。
それによりコンパイルする時に、どのパッケージを外部に公開するかが適切に設定されています。
モジュール「hello」はパッケージ「com.example」をエクスポートしています。
このようにエクスポートすることで他のモジュールからアクセス可能になりますが、今回の例では他モジュールからのアクセスは想定されておらず、mainメソッドが正常に動作し出力されます。
誤答理由:
コンパイルや実行時エラーが発生するとの選択肢がありますが、今回は適切にモジュールが設定されています。
モジュールエラーやコンパイルエラーが起こる可能性があるケースとして、パッケージ名とモジュール名が競合したり、エクスポートされていないパッケージメンバーにアクセスしようとしたりすることが挙げられます。
特に今回の問題では、単純にメインメソッドのみ動作するため最終結果として”Hello, World!”を出力する形になります。
つまずきポイント:
モジュールを初めて学ぶ時、静的なモジュール設定ファイルのシンタックスや概念が難しく感じられるかもしれません。
通常、モジュールは他モジュールと相互に依存関係がありますが、
今回の問題のように必要最小限の設定で動作するケースもあります。
特に、モジュールの設定をきちんと行っているかどうかがシステムの動作性に大きく影響します。
「exports」によるパッケージの公開範囲を誤りなく指定することで、適切な動作を確認することができます。
発展知識:
モジュールシステムは、ジャクションやサードパーティーのライブラリを使用する際にも有用になります。
「requires」ステートメントを使用することで、他のモジュールを明示的に指定して依存関係を解消できます。
たとえば、SQLや通信関連のモジュールを利用する際に、
それに対応するモジュール名を「requires」で定義できるため、
依存性が曖昧になることを防ぎ、拡張性のある設計が可能です。
モジュールシステムは、Javaプログラムの安全性と拡張性を向上させるためにますます重要な役割を果たしています。