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


関連記事

pageEncodingとcontentTypeのcharsetの違い

pageEncodingとcontentTypeのcharsetは処理されるタイミングが異なります。 それによって文字化けの原因につながっているので、どのように設定すればいいかを解説していきます。 違 …

【Java転職者向け】どんなポートフォリオを作成すべきか?

Javaプログラマとして開発リーダと新人教育をした立場から執筆しています。 対象読者 未経験からJavaプログラマに就職・転職しようとする方 目次 なぜポートフォリオを作成するのか? ・スキルアップ …

【SpringBoot入門】#12~ 削除機能の実装

概要 ダイアログでOK押下された場合の削除処理を実行します。 画面からリクエストされた書籍情報IDをキーに、論理削除を実装します。 システム開発ではほとんどの場合、論理削除を行います。 物理削除するの …

【Java】ArrayListの使い方まとめ

概要 ArrayListはOracleの公式ページでも明記しているクラスです。 Java SE 11 Programmer I (1Z0-815-JPN) 試験 インタフェースによる抽象化 インタフェ …

no image

【MySQL】自テーブルのカラムの値を0埋めで更新する方法

構文

記載例

  UPDATE前後の値を比較 UPDATE …

記事を探す

SpringFramworkの良書

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

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