MENU

【Java Silver】モジュール型プロジェクトのコンパイルと実行

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

問題

以下のモジュール型プロジェクトをコンパイルして実行した際の出力はどれですか?正しい選択肢を選んでください。


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(実行時エラー)は、モジュールが正しく構成されていないか、例外が発生する場合に妥当ですが、この問題ではそのような心配はありません。

つまずきポイント

モジュールシステムの導入により、パッケージのエクスポートやモジュールの依存関係を正しく管理する必要があります。特に、exportsrequiresキーワードの使い方を誤ると、コンパイルエラーやランタイムエラーの原因となります。

また、モジュール内でのパッケージの正確な記述や、依存関係におけるモジュールの参照の誤りも注意が必要です。

発展知識

モジュールシステムは、大規模なプロジェクトにおける依存関係の管理を簡素化し、コードの分割と再利用を促進します。また、--module-pathオプションを使ってモジュールパスを指定したり、module-info.javaファイルによってモジュールの詳細を記述する必要があります。

これにより、モジュール間のコンパイル時や実行時の問題を軽減し、より堅牢で保守可能なコードベースを作成することができます。

目次