無名モジュール
module-info.java
ファイルを持たない既存のクラスやライブラリが属するデフォルトのモジュールである。
特徴
-
モジュール名の欠如:
明示的なモジュール名を持たない。従来のクラスパス上のクラスやライブラリは、自動的に無名モジュールに所属する。 -
アクセス制御の緩さ:
他のモジュールからのアクセス制御が緩いため、従来の非モジュール化されたクラスとの相互運用性を確保する。
無名モジュール内のクラスは、クラスパス上の他のクラスやライブラリからアクセスできる。 -
依存関係の解決:
他のモジュールへの依存関係を宣言することはない。したがって、依存関係の解決は行われない。
名前付き、自動、無名モジュールの比較
3つのモジュールについて以下の観点で比較した。
- 定義と識別
- 依存関係の解決
- アクセス制御
- 配置
定義と識別
- 名前付きモジュール:
明示的なモジュール名を持ち、module-info.java
ファイルで定義される。 - 自動モジュール:モジュール名が自動的に生成される。
- 無名モジュール:明示的なモジュール名を持たない。
依存関係の解決
- 名前付きモジュール:他のモジュールへの依存関係を宣言し、依存関係の解決が行われる。
- 自動モジュール:名前付きモジュールと同様。
- 無名モジュール:依存関係を宣言せず、解決も行われない。
アクセス制御
- 名前付きモジュール:アクセス制御が行われる。
exports
ディレクティブでパッケージの公開を制御する。 - 自動モジュール:アクセス制御が行われる。既定ですべてのパッケージを公開する。
- 無名モジュール:アクセス制御が緩く、従来の非モジュール化されたクラスとの相互運用性を確保する。
配置
- 名前付きモジュール:モジュールパス上に配置される。
- 自動モジュール:名前付きモジュールと同じ。
- 無名モジュール:クラスパス上に配置される。
名前付き、自動、無名モジュールの使い分け
名前付きモジュール
- プロジェクト内で新しいモジュールを定義する場合や、サードパーティのライブラリをモジュール化する場合に適している。
- 明示的なモジュール名を持ち、依存関係の解決やアクセス制御が行われるため、モジュールの整合性やセキュリティの向上、モジュール間の明確な依存関係の管理が必要な場合に使用する。
自動モジュール
- 従来のクラスパス上の既存のJARファイルをモジュール化する場合に適している。
-
module-info.java
ファイルを持たないJARファイルをモジュールとして扱う。 - 依存関係の解決やアクセス制御が行われ、相互運用性を確保する。
- 一時的な手段として使用し、将来的には名前付きモジュールに移行することが推奨される。
無名モジュール
- モジュール化されていない既存のクラスやライブラリをそのまま利用する場合に適している。
-
module-info.java
ファイルを持たず、アクセス制御が緩いため、既存のクラスパス上のコードとの相互運用性を確保する。 - 名前付きモジュールや自動モジュールへの移行中に一時的な手段として使用される。
名前付き、自動、無名モジュール間の参照制限
(↓)参照元(→)参照先
名前付き | 自動 | 無名 | |
---|---|---|---|
名前付き | - | ○ | × |
自動 | △(※) | - | ○ |
無名 | × | △(※) | - |
(※)--add-modules
オプションでモジュール名を指定すれば参照可能。
適切なモジュールの選択は、プロジェクトの要件や目標に基づいて行う必要がある。
プロジェクトが完全にモジュール化される場合は、できるだけ名前付きモジュールを使用することが推奨される。自動モジュールと無名モジュールは、既存の非モジュール化されたコードの一時的な統合や互換性の確保のために使用される。