疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【Java】パッケージの利点

みなさんはパッケージ使っていますでしょうか。
私は学習する上では基本的に使っていませんでした。
特に指定がない限りは使いませんよね。

Web系の学習でようやく使おうかな?とか思ったくらい。
サーブレットやJSPのあの辺りです。

しかしアプリケーションを作るとなるとパッケージ分けはほぼ必須です。
というのもファイル数が多いからです。


まずはパッケージに属するための条件を見ていきます。

1.ソースの先頭にパッケージ宣言をする
2.宣言したパッケージ名と同じ名前のフォルダに入っている

これだけ。

以下がパッケージに属したクラスの例です。

SampleStudy.java

package sample;

public class SampleStudy {
	public static void main(String[] args) {

	}
}

先頭でsampleというパッケージに属していることを宣言しています、
この宣言は必ず最初に行う必要があります。
つまりimport文よりも先に記述します。
これはJavaの決まり事で、守らなければコンパイルエラーが発生。
ただしコメントがpackage宣言よりも先にあるのはOKです。

ですがこの記述だけではパッケージには属していません。
宣言通りの名前のフォルダに格納されている必要があります。
パッケージに入ってるよっていう宣言をしている以上当たり前ですが。


そしてパッケージ分けを行う利点。

1.見た目がスッキリする
私はこれが一番好きですね。
ファイル数が多くなるとどうしても似ている名前のファイルが出てきますし探すのも面倒になります。
そんな時、パッケージ分けをしておくことで安易に見つける事が可能。

2.同名のクラスが作成可能
パッケージが違う場合は同じ名前のクラスを作成出来ます。
逆を言えば、同じパッケージの中では同名のクラスは作成不可能です。
その名前のクラスは既にあるよ!って怒られます。

3.アクセス制限を設けられる
パッケージに限った話ではありませんが、アクセス制限を設けることが出来ます。
アクセス修飾子を使うやつですね。
publicとかそういうの。
修飾子を付けないことで同一パッケージ内からのみアクセス可能になります。


ざっとこんなものでしょうか。
そしてパッケージと言えばインポートです。
セットです。

例えば先ほどのクラスを使用したい場合は以下のようになります。

HelloStudy.java

package hello;

import sample.SampleStudy;

public class HelloStudy {
	public static void main(String[] args) {
		SampleStudy sampleStudy = new SampleStudy();
	}
}

違うパッケージからSampleStudyのインスタンスを生成しています。
パッケージが異なるのでインポートしないとクラスを見つけられません。

ただしこれには抜け道があります。
そのクラスを明示的に記述することでインポートしなくても参照可能になります。

HelloStudy.java

package hello;

public class HelloStudy {
	public static void main(String[] args) {
		sample.SampleStudy sampleStudy = new sample.SampleStudy();
	}
}

パッケージ名も含めてクラス名を記述します。
インポートしていませんがコンパイルエラーで怒られることはありません。
ちゃんとインスタンス生成出来ます。

インポートするかしないか、どちらが良いとは一概には言えません。
ですがインポートしておいて間違いはないかなと思います。


そしてもう1つ。
細かいことですがパッケージの命名規約。
Javaに関しては、パッケージはすべて小文字が一般的です。
クラス名の頭文字が大文字なので区別が付きやすいためだそう。

パッケージ分けをしっかり行い、読みやすいプログラムを心がけたいですね。
今回は以上になります。