Project Jigsawの4回目となる今回は、APIの公開について紹介します。前回は、モジュールの依存性について紹介しました。今回は、公開範囲の設定など、公開に関してもう少し詳しく解説していきましょう。

公開範囲の設定

 前々回、モジュールの定義とパッケージの公開範囲の設定について簡単に紹介しました。

 簡単におさらいすると、モジュールの定義はmodule-info.javaに、module文を使用して定義します。パッケージを公開する場合は、exports文でパッケージを指定するようにします。

 例えば、net.javainthebox.fooモジュールがnet.javainthebox.barパッケージを公開する場合、module-info.javaはリスト1のようになります。

  

リスト1●net.javainthebox.fooモジュールの定義

module net.javainthebox.foo {
    exports net.javainthebox.bar;
}

  

特定のモジュールにのみ公開

 複数のモジュールから構成されているアプリケーションの場合、あるモジュールをアプリケーション内だけで使用したいことがあるかもしれません。例えば、内部用の実装なので、外部に公開したくない場合などがこれに相当します。

 このような場合、exports文で公開するパッケージを、特定のモジュールに限定することが可能です。例えば、リスト1のnet.javainthebox.barパッケージを、net.javainthebox.bazモジュールとnet.javainthebox.quxモジュールだけに公開する場合、リスト2のように記述します。

  

リスト2●特定のモジュールだけにパッケージを公開する

module net.javainthebox.foo {
    exports net.javainthebox.bar to net.javainthebox.baz, net.javainthebox.qux;
}

  

 exportの後にパッケージを指定するところまで同じですが、その後に赤字で示したtoと公開するモジュールをカンマ区切りで列挙していきます。このように記述することで、toの後に指定したモジュールにだけパッケージを公開できます。それ以外のモジュールから、このパッケージにアクセスすると、IllegalAccessError例外がスローされます。

 リスト2に示したmodule-info.javaをコンパイルする場合、モジュールパスにパッケージを公開するモジュールが配置されている必要があります。公開先のモジュールが存在しない場合、コンパイルエラーになります。このことから、module-info.javaのコンパイル時に、公開先のモジュールの有無をチェックしていることが分かります。