個人的な学習メモ。
パッケージとパッケージを単位とする様々な設定についての解説になります。
パッケージ
クラスやインターフェースを名前空間において束ねる役割をするもの。
同一パッケージ内に同じ名前のクラスやインターフェースがあるとビルドできない。
なお、以下の用語はすべてパッケージ単位を前提にする。
クラスパス
Javaの実行環境(JVM)でプログラムを実行する時にクラスを探し出すパスのこと。コマンド実行においてはcpオプションで指定する。
java -cp ./bin Main
※./binがクラスパス
モジュール
複数のパッケージやクラスをまとめたもの。
モジュールシステム
Javaのモジュールシステムは、パッケージ単位でアクセス制御を行う仕組み。(この見出しの下にも書いたがFrameworkやmavenで管理されている場合は使用されない)
なお、モジュールシステムにおけるアクセス制御はmodule-info.javaというファイルに定義する。Java9で実装された機能で、どのクラスがどのクラスに依存できるか定義する。以下の例では、appモジュール(クラス)はlibのクラスをimportして使うことができる。
module com.example.app { requires com.example.lib; // 他のモジュールに依存 exports com.example.api; // このパッケージだけ公開 }
※appはlibに依存している。依存は一方向のため、libはappに依存していない。もしlibがappに依存したいならば、libがappに依存しているという定義が必要になる。
※モジュールシステムは設計者がクラスの関係性を意識させるために有効である。
※ただし、SpringなどのFrameworkは独自の依存管理をしており、MavenやGrableなどのパッケージ管理ツールを使っているとそれらが依存管理をする。そのため、このモジュールシステムは現在はあまり使われていないそうだ。したがって、すべてのモジュールに、このモジュールシステムの定義ファイルがある、というものでもない。(いささか暴論なことを承知で言ってしまえば、)知っておいたほうがいいJavaの仕様だが知らなくても凡庸なJavaプログラマは困らない(仮説)ググると金融系SIのアーキテクトが詳しい解説をしているが、”いいね”が少ない=モジュールの使用者から知識が必要とされる頻度があまり高くないと思われる。
アクセス修飾子
クラスやメソッドに付与されるpublicやprivateなどの記述のことをアクセス修飾子という(これそのものの名前を気にしたことがなかった)
publicであればどこからでもアクセス可能で、privateだと同じクラスからのみアクセスできる。
なおpublicを設定しないと、同じパッケージ内からのみアクセス可能となる(どこからでもアクセス可能にはならない)。
protectedは同じパッケージか継承したクラスからアクセスができる(あまり登場しないので必要に応じていつも調べている)。
アクセス修飾子 | 同じクラス内 | 同じパッケージ内 | サブクラス(別パッケージ) | 他のパッケージ |
---|---|---|---|---|
public |
○ | ○ | ○ | ○ |
protected |
○ | ○ | ○(継承時のみ) | × |
(何も書かない) default access |
○ | ○ | × | × |
private |
○ | × | × | × |
※ 「何も書かない」はデフォルトアクセス修飾子(default access)を意味します。
※phpだと、何も書かない=public=全公開という意味になるが、javaだと「何も書かない」と「public」は違う設定として区別されるので注意が必要。パッケージ内部での使用を意図したクラスの場合は、あえて書かない選択をすることがある。
コメント