作っているシステムが大きくなりクラスの量が増えてくると雑然としてきます。ソースコードのディレクトリは.javaのファイルがたくさんになってきます。これを整理するための機能がパッケージです。
パッケージとは
いわゆるファイルシステムのディレクトリと同じ考え方です。今まで作っていたパッケージ指定がないクラスは「デフォルトパッケージというパッケージに含まれる」扱いになっていました。これはファイルシステムでいうトップのディレクトリに相当します。
パッケージは階層にすることができます。階層の区切りはピリオドで表現します。パッケージとディレクトリは以下のような関係になります。
パッケージの例 | 対応するディレクトリ |
指定なし(デフォルト) | / |
some_package | /some_package/ |
sume.more.packages | /some/more/packages |
大きな組織の場合はドメインを逆に形にしたものをパッケージにすることを推奨されているようです。abcde.co.jpという会社がnew_systemというアプリケーションを作る場合パッケージ名は
jp.co.abcde.new_system
にする、と言った具合です。
パッケージを意識したクラスを作成する
では実際にパッケージを分けたクラスを作ります。まず任意のディレクトリをトップディレクトリと決めます。そこにサブディレクトリanimalとplantを作ります。
animalにはLion.javaを作ります。
package animal; public class Lion { public String getText(){ return "I am a lion."; } }
今までとの違いは二点です。
一つはパッケージ指定が最初の行に書かれていること
package animal;
つまり「このクラスはanimalというパッケージのものです」と宣言しているのです。これは「このソースファイルがサブディレクトリ /animalに置かれている」という意味にもなります。
またメソッドgetTextの先頭にpublicという指定があります。これがないとこのメソッドはパッケージ内からしかアクセスできなくなります。これをパッケージプライベートと言います。パッケージ外からもアクセスを許すためにはpublicという記述が必要になります。
同様にplantパッケージのRoseクラスのjavaファイルRose.javaもサブディレクトリplantにおきます。内容は以下の通り。
package plant; public class Rose { public String getText(){ return "I am a rose."; } }
記述内容はLionとほぼ同じです。
さてこれを利用するクラスをデフォルトパッケージに作ります。AnimalPlantTest.javaファイルの内容は以下の通り。
import animal.Lion; import plant.Rose; public class AnimalPlantTest { public static void main(String[] args){ Lion lion = new Lion(); Rose rose = new Rose(); System.out.println(lion.getText()); System.out.println(rose.getText()); } }
LionクラスとRoseクラスを利用するにはimport宣言をしてパッケージも含むフルネームでクラスを指定します。mainメソッドではそれぞれのインスタンスを作り各メソッドを呼び出して結果を標準出力に出力しています。
コンパイルはトップディレクトリで
javac AnimalPlantTest.java
を行います。中で参照されているLion.java、とRose.javaも一緒にコンパイルされるはずです。
実行した結果は以下の通りです。
java AnimalPlantTest I am a lion. I am a rose.