プログラミング 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


関連記事

【JdbcTemplate】Queryの書き方(SELECT文)

JdbcTemplateでQueryを書く方法です! (SELECT文で、1件・複数件を取得するケース)   前提 以下のテーブル(users)を持ち、格納するのはUserクラスという想定で …

【Java】MapをStreamで処理する方法 7選!

概要 【Java】ListをStreamで処理する方法 7選! 【Java】SetをStreamで処理する方法 7選! に続き、Map編です。 Mapをstreamで扱う場合、entrySetまたはK …

【Java入門】判定処理(if, if else, switch文)の使い方まとめ

概要 判定処理には、if / if-else / switch文があります。 これらはとても基本的な判定処理ですが、基本的な使い方に加えて、ちょっとした構文上のTipsや注意点についても解説していきま …

エンジニア未経験者の転職が難しくなったので解決策を提案してみる

現状 コロナ以降、未経験者のエンジニア採用が少しずつなくなっていきました。 それまではポートフォリオを作ったり、ある程度のポテンシャルがあると判断されれば 採用されるということがあったのですが、それが …

【SpringSecurity】#2~ ユーザ毎の権限設定(認可)

概要 権限によって、アクセス可能なページを制限する機能の実装します。 管理者画面を作成し、権限によって画面の出し分けを行います。 前提 #1~ ログイン画面の実装が完了していること。 管理者画面の追加 …

SpringFramworkの良書

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

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