―Javaプログラミングの前提知識―
2001/7/13
パッケージを理解し利用する |
今回の内容
|
パッケージの作り方、使い方 パッケージの構造とディレクトリ |
パッケージとはいくつかのクラスをまとめたものです。主に3つの目的で使われます。
- クラスの分類
- クラス名の衝突を防ぐ
- アクセス制御を行う
(1)クラスの分類
クラスが大量に存在すると、プログラマーは必要なクラスを見つけにくくなります。そこで、互いに関連するクラス同士をパッケージとしてまとめることによって、必要なクラスを簡単に探し出せるようにします。例えば、Javaの標準クラスライブラリでは、ファイルの読み書きなどのためのクラスはパッケージjava.ioに、ネットワーク関連のクラスはパッケージjava.netに、というように機能別に分かりやすくまとめてあります。
(2)クラス名の衝突を防ぐ
Java VMは名前をもとにしてクラスを読み込むため、同じ名前のクラスが複数存在すると、間違ったクラスを読み込んでしまい、エラーが起きる可能性があります。そのため、プログラマーは作成するクラスの名前がほかのクラスの名前と同じにならないように気を付けなければなりません。
しかし、クラスの名前が衝突しないようにするのは困難です。クラスの名前を長くすれば、衝突を防ぐことができるかもしれませんが、その代わりコーディング作業が面倒になります。そこで、プログラマー、特にクラスライブラリを作成するプログラマーは、クラスをパッケージとしてまとめます。そしてパッケージの名前がほかのパッケージの名前と異なるようにします。結局、名前が衝突しないように気を付けなければなりませんが、パッケージの名前はクラスの名前に比べればプログラム中に現れる回数は少ないので、パッケージ名を長くしてもプログラマーの負担は重くなりません。
(3)アクセス制御を行う
パッケージを利用することで、同じパッケージ中のクラスからはアクセスできるが、ほかのパッケージ中のクラスからはアクセスできないようなメソッドやメンバ変数を定義したり、ほかのパッケージからアクセスできないようなクラスを作成したりすることができます。
パッケージの作り方、使い方 |
クラスをパッケージの中に入れるには、そのクラスのソースファイルの先頭で、キーワードpackageを用いてパッケージを指定します。例えば、クラスCarをパッケージjp.co.atmarkit.fjava.vehicleの中に入れるなら、ソースファイルCar.javaの先頭で以下のように書きます。
package jp.co.atmarkit.fjava.vehicle; |
ほかのパッケージ中のクラスからこのクラスCarを参照するには、パッケージ名を含めてクラス名を指定しなければなりません。例えば、ほかのパッケージ中のクラスでクラスCarのオブジェクトを生成するには以下のようにします。
jp.co.atmarkit.fjava.vehicle.Car
car = new jp.co.atmarkit.fjava.vehicle.Car(); |
しかし、上のようにパッケージ名を指定してクラスを参照するのは面倒です。そこで、キーワードimportを用いると、パッケージ名の指定を省略することができます。例えば、パッケージ名jp.co.atmarkit.fjava.vehiclerを省略したいなら、そのクラスを参照しようとしているクラスのソースファイルの先頭で以下のように書きます。
import jp.co.atmarkit.fjava.vehicle.Car; |
すると、そのソースファイル内では以下のようにパッケージ名を省略してクラスCarを参照することができます。
Car car = new Car(); |
ちなみに、同じパッケージ中のクラスから参照する場合には、import文で指定しなくてもパッケージ名を省略することができます。さらに、パッケージjava.lang中のクラスを参照する場合も、importで指定しなくてもパッケージ名を省略することができます。
上の例のimport文では、パッケージ中の1つのクラスを指定しましたが、パッケージ中のすべてのクラスをまとめて指定することもできます。例えば、パッケージjp.co.atmarkit.fjava.vehicle中のすべてのクラスをパッケージ名を省略して参照したいときは、以下のように書きます。
import jp.co.atmarkit.fjava.vehicle.*; |
さらに、import文は複数指定することもできます。例えば、パッケージjp.co.atmarkit.fjava.vehicle中のすべてのクラスとパッケージjava.io中のすべてのクラスを、パッケージ名を省略して参照したいときは以下のように書きます。
import jp.co.atmarkit.fjava.vehicle.*; |
ちなみにimport文を指定すると、クラス名の衝突が起きる場合があります。この場合、名前が衝突しているクラスを参照することはできません。
例えば、パッケージjp.co.atmarkit.fjava.vehicleとパッケージjava.ioの両方に、クラスNotActiveExceptionが存在するときに、以下のようにまとめてimport文を指定すると、コンパイラはどちらのパッケージ中のクラスを参照しているのか分からないため、コンパイルエラーとなります。
import jp.co.atmarkit.fjava.vehicle.*; |
このときは、以下のように1つのクラスだけを指定するimport文を加えます。
import jp.co.atmarkit.fjava.vehicle.*; |
ただし、この場合、パッケージ名を省略できるのは、パッケージjp.co.atmarkit.fjava.vehicle中のクラスNotActiveExceptionだけです。パッケージjava.io中のクラスNotActiveExceptionを参照するには、パッケージ名java.ioを指定しなければなりません。
パッケージの構造とディレクトリ |
パッケージの構造とディレクトリは一致させなければなりません。一致していない場合、Java VMはクラスを見つけることができず、エラーが起きます。
例えば、パッケージjp.co.atmarkit.fjava中にクラスExampleを定義したときには、パッケージ名を、記号"."で区切られたディレクトリ階層であると見なして、クラスパスの通っているディレクトリ下のディレクトリjp\co\atmarkit\fjavaにクラスファイルExample.classを置かなければなりません。仮にクラスパスをC:\classesと指定したならば、ディレクトリC:\classes\jp\co\atmarkit\fjava\中にクラスファイルExample.classを置きます。
またJava VMを実行するときは、パッケージ名を省略することはできません。例えば、パッケージjp.co.atmarkit.fjava中のクラスExampleを実行するには、以下のようにします。
java jp.co.atmarkit.fjava.Example |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|