今回も問題を解いていきましょう。
問題
以下のモジュール型プロジェクトをコンパイルして実行した際の出力はどれですか?正しい選択肢を選んでください。
module zoo {
exports com.zoo.animal;
}
package com.zoo.animal;
public class Elephant {
public void speak() {
System.out.println("Trumpet");
}
}
module app {
requires zoo;
}
package com.app;
import com.zoo.animal.Elephant;
public class MainApp {
public static void main(String[] args) {
Elephant elephant = new Elephant();
elephant.speak();
}
}
選択肢
- A. Trumpet
- B. コンパイルエラー
- C. 実行時エラー
- D. エラーなしで何も出力されない
答えと解説
回答を見る
答え
A. Trumpet
解説
基本説明
Java 9以降では、モジュールシステムが導入され、複数のモジュールを作成してそれらを組み合わせることができます。この問題では、zoo
モジュールとapp
モジュールが定義されています。
zoo
モジュールは、com.zoo.animal
パッケージをエクスポートしており、app
モジュールはzoo
モジュールを必要としています。
Elephant
クラスのインスタンスを作成し、そのspeak
メソッドを呼び出すMainApp
クラスの実行により、”Trumpet”が出力されます。
誤答理由
選択肢B(コンパイルエラー)が考えられるのは、例えば、パッケージをエクスポートし忘れた場合や、モジュール間の依存関係を正しく定義していない場合です。しかし、この問題ではすでに正しく設定されています。
選択肢C(実行時エラー)は、モジュールが正しく構成されていないか、例外が発生する場合に妥当ですが、この問題ではそのような心配はありません。
つまずきポイント
モジュールシステムの導入により、パッケージのエクスポートやモジュールの依存関係を正しく管理する必要があります。特に、exports
やrequires
キーワードの使い方を誤ると、コンパイルエラーやランタイムエラーの原因となります。
また、モジュール内でのパッケージの正確な記述や、依存関係におけるモジュールの参照の誤りも注意が必要です。
発展知識
モジュールシステムは、大規模なプロジェクトにおける依存関係の管理を簡素化し、コードの分割と再利用を促進します。また、--module-path
オプションを使ってモジュールパスを指定したり、module-info.java
ファイルによってモジュールの詳細を記述する必要があります。
これにより、モジュール間のコンパイル時や実行時の問題を軽減し、より堅牢で保守可能なコードベースを作成することができます。