プログラミング Java

【Java】モジュールシステムの概要と実装例

投稿日:

概要

Javaのモジュールシステムについて、概念的なイメージと実際のコード例で理解を深めるための記事です。
読者はJava Silverの資格勉強中の方やJava入門者を想定しています。

内容は以下のようになっています。
・基本的なモジュール参照
・推移的なモジュール参照
・限定的なモジュール参照

環境
・Eclipse
・Java11

モジュールシステム概要

Java9から導入された仕組みです。
これによりパッケージ単位で公開/非公開を設定できるようになりました。

Java8以前まではパッケージ単位で設定できなかったので、publicなクラスにしてしまうとどのパッケージからでもアクセスできてしまうという課題がありました。
モジュールシステムが導入されたことで、特定のパッケージからのみアクセス可能にすることもできるようになり、パッケージ単位での情報隠蔽が実現されました。

全体像

本記事で解説するパッケージ構成の全体像です。

後続で個々のケースについて詳解していきますので、ここではまず4つのモジュールがあること、またそれぞれがどのモジュールを参照しようとしているかについてイメージを持っていてください。

基本的なモジュール参照


基本的なモジュール参照のケースです。
ここではmoduleAがexpパッケージを公開し、selfがmoduleAを参照しています。

moduleAの構成

  • module-info.java

  • Hello.java

selfの構成

  • module-info.java

  • Hello.java

  • SelfMain.java

  • ビルドパス
    moduleAをビルドパスに追加します。

実行結果

推移的なモジュール参照


推移的なモジュール参照のケースです。
ここではmoduleCがexp2パッケージを公開し、moduleAが参照時にtransitive指定することで、moduleAを参照するモジュールにもmodeulCが参照できるように宣言しています。
そのため、selfはmoduleAを参照することでmoduleCを利用することができるようになります。

moduleCの構成

  • module-info.java

  • Hello.java

moduleAの構成
変更なし

  • module-info.java

  • Hello.java
    変更なし

selfの構成
変更なし

  • module-info.java
    変更なし
  • Hello.java
    変更なし
  • SelfMain.java

  • ビルドパス
    moduleCをビルドパスに追加します。

実行結果

限定的なモジュール参照


限定的なモジュール参照のケースです。
ここではmoduleBがexp3パッケージをmoduleAに対してのみ公開しています。
そのため、moduleA以外(self)からはmoduleBを利用することができないようになっています。

moduleBの構成

  • module-info.java

  • Hello.java

moduleAの構成
変更なし

  • module-info.java

  • Hello.java
    変更なし

selfの構成
変更なし

  • module-info.java

  • Hello.java
    変更なし
  • SelfMain.java

  • ビルドパス
    moduleBをビルドパスに追加します。

実行結果

まとめ

  • モジュールシステムとは端的に言うと、パッケージ単位で情報隠蔽を実現する仕組みである。
  • 基本的なモジュール参照は、exportsでパッケージを公開し、requiresで参照先を指定する。
  • 推移的なモジュール参照は、requires transitive指定することで自身が参照する他のモジュールを自身を参照している他のモジュールにも公開することができる。
  • 限定的なモジュール参照は、指定したモジュールのみに対して公開することができる。

参考

本記事のモジュール構成は以下の記事を参考にさせて頂きました。
Javaのモジュールシステム入門

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

【SpringBoot入門】#3~ Index画面の作成

このチュートリアルでは、簡易な書籍管理システムを作っていきます。 まず最初にIndex画面を作成していきます。 HTML作成 以下の配下にindex.htmlを作成します。 配置先:プロジェクト(ここ …

kotlin,

【Kotlin】SpringのテストでUnsatisfiedDependencyExceptionが発生した場合の解消方法

概要 Qurifier指定をしたRepositoryをDIしたContollerをテストしたときにUnsatisfiedDependencyExceptionが発生した状況と解決方法です。 (参考書籍 …

【Spring】バリデーション時に、入力値を保持する方法

登録画面で「登録」ボタンを押した後、 バリデーションで引っ掛かってエラーになっても 入力内容を画面に保持して置く方法についてです。 テンプレートエンジンは、Tymeleafを使用しています。 方法とし …

【Java入門】繰り返し処理(while, for)

概要 繰り返し処理の制御構造について学んでいきましょう。 繰り返しには以下があります。 while(条件に一致する間だけ繰り返す) do-while(一度必ず実行し、その後は条件に一致する間だけ繰り返 …

Springでバリデーションがimportされていないときの対処法

状況 SpringF/Wでバリデーションを実装したいが、@NotNullや@Minといったアノテーションが使えない。 @NotNullを使おうとすると、import com.sun.istack.No …

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。