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


関連記事

【Java】重複しないリストはSetを使う!(用途別 3種類)

概要 重複しないリストは、「Setに格納することで重複を除外してくれる」というのは多くの記事で紹介されています。 ここでは、Setに格納した後のデータの並び順も考慮したいという要件に対応するために、3 …

【SpringSecurity】#3~ 独自のログイン画面

概要 オリジナルのログイン画面を実装する方法です。 以下の内容になっています。 ログイン用のHTMLを用意する。 Controllerにログインの遷移先を定義する。 SecurityConfigクラス …

MySQL-タイムゾーン設定すると起動しなくなる原因と対処方法

MySQLのタイムゾーン設定をすると、XAMPPでMySQLが起動できなる原因と対処法です。   原因 原因は、MySQL(MariaDB)は最初から日本語設定が入ってないためです。 def …

使って便利だったNode.jsのnpmモジュール

Excel操作 xlsx Excelファイルからシート単位でデータを読み取り、JSON化することができるモジュール。 VBAでは処理が遅い場合の代替手段となるが、書式設定はできない。 JSONファイル …

【Java】ArrayListの最長文字列を取得する簡単な方法

(追記)2020/08/19 1. Listが空の場合(NoSuchElementException)に対応しました。 2. Nullが含まれていた場合、空文字として扱うように修正しました。 Arra …

記事を探す

SpringFramworkの良書

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

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

サイト内検索