パッケージ (Java)

Javaパッケージ(Java package)は名前空間の中にあるJavaクラスをまとめるメカニズムである。Javaパッケージは、JARファイルと呼ばれる圧縮ファイルの中に保存することができ、クラス群を一つのグループとしてまとめた方が1つずつダウンロードするよりも高速化される。プログラマも一般に同じカテゴリに属しているクラスや類似した機能を提供するクラスをまとめたパッケージを使う。

Javaソースファイルはファイルの先頭にソースファイルが定義したクラスのパッケージを明示するpackage構文を含むことができる。

 パッケージはそれが含むタイプに関してユニークな名前空間を提供する。
 同じパッケージにあるクラス群はお互いに保護された(protected)メンバにアクセスできる。
 パッケージは次に述べる種類の型を含むことができる。
 クラス
 インタフェース
 列挙型
 アノテーション

C++などの言語に使われているnamespace (名前空間)に似ているが、その名前空間よりも機能は限定的であり、階層構造を持たず、クラス名の衝突を避けるために存在する。またそのパッケージ内にあるクラスに対しては、package privateといった設定が可能であり、package privateなクラスはパッケージ外部のクラスからのアクセスが禁止され、カプセル化による情報隠蔽を実現できる。これによりGoFデザインパターンの一つ、Facade パターンをより忠実に実現することができる。

パッケージ使用 

Javaソースファイルでは、ファイルが属しているパッケージにはpackage キーワードが明示されている。
package java.awt.event;
Javaソースファイル内でパッケージを使うことで、import文でパッケージからクラスをインポートすることは便利なものとなる。この構文
 import java.awt.event.*;
は java.awt.event からすべてのクラスをインポートする。一方、
 import java.awt.event.ActionEvent;
はパッケージからActionEventクラスだけをインポートする。これらのimport文どちらも、以下のように単純クラス名でActionEvent クラスを参照利用することができる:
 ActionEvent myEvent = new ActionEvent();
クラスはクラス完全修飾名を使うことでimport文無しで直接使うことができる。例えば、
 java.awt.event.ActionEvent myEvent = new java.awt.event.ActionEvent();
は前述のimport文を要求しない。

パッケージアクセス保護 

パッケージ宣言付きクラスはデフォルトアクセス(default access)宣言(修飾子無指定)したクラスやメンバ、protectedアクセス修飾子宣言されたクラスメンバにアクセスできる。デフォルトアクセスはpublic、protected、privateアクセス修飾子が宣言に指定されていないときに強要される。それとは対照的に、他のパッケージ内にあるクラスはデフォルトアクセス宣言されたクラスやメンバにアクセスできない。protected宣言されたクラスメンバはそのクラスのサブクラスである他のパッケージ内クラスからのみアクセスすることができる。

JARファイル生成 

JARファイルはjarコマンドラインユーティリティによって生成される。そのコマンド
 jar cf myPackage.jar *.class
はすべての拡張子.classファイルをJARファイルmyPackage.jarに圧縮する。コマンドラインオプション'c'はjarコマンドに「新しいアーカイブを作れ」と指示する。'f'オプションはJARファイルが生成されるファイル名の直前に置く必要がある。

パッケージ命名規約 

パッケージは通常、ピリオド(.) （「ドット」と発音）によって分割された階層レベルで階層命名パターンを使用する。名前階層が下位であるパッケージはしばしば上位層に相当するパッケージの「サブパッケージ」と呼ばれるが、パッケージ間には意味的な関係は無い。Java Language Specification は二つの公開されたパッケージが同じ名前を持つことを避けるためにパッケージ命名規約を設けている。命名規約がユニークなパッケージ名を作成する方法を説明するように、広く配布されたパッケージはユニークな名前空間を持つだろう。これはパッケージ群が簡単で無意識的にインストールされカタログ化されるようにしている。

パッケージ名は組織のトップレベルドメイン名と、そのときの組織のドメインといくつかのサブドメインリストが逆順になったもので始まることが推奨されている。組織はそれらの名前にそのときに特定の名前を選ぶ。パッケージ名は可能ならばすべて小文字にすべきである。

例えば、もしカナダにMySoftと呼ばれる組織がfraction(小数、分数)を扱うパッケージを作るとすると、パッケージをca.mysoft.fractionsとネーミングすることは、他社によって開発された類似するもうひとつのパッケージからfractionパッケージを見分ける。もしMySoftと呼ばれるアメリカの企業もまたfractionパッケージを作るとするが、名前はcom.mysoft.fractionsであり、そのとき、それら二つのパッケージにあるクラスはユニークに定義され、名前空間は分割される。

曖昧でないパッケージ名に関して完全な規約と、パッケージ名に直接使うことができないインターネットドメイン名をパッケージに命名するルールは、Java言語仕様のChapter 6.1で説明されている。

ハイフン(-)が使われているドメイン名をそのままJavaソースコードで使用するとコンパイルエラーを引き起こす。そのためハイフンが使われているドメイン名には、ハイフンの代わりにアンダースコア
(_)を使用する。

Java SE 5 から追加されたアノテーション 
Java SE 5から追加されたアノテーションは、パッケージも対象にすることができる。
パッケージにアノテーションを保存するには、該当するパッケージディレクトリにpackage-info.javaというファイルを作り、以下のように記述する。
 /**
  * パッケージの説明。
  * パッケージのコメントにはJavadocのタグがそのまま使える。
  */
 @Deprecated package com.example.wikipedia;
この例は、パッケージcom.example.wikipediaを非推奨にしていることを意味する。このpackage-info.javaはJavaコンパイラに警告を表示させる以外に、Javadocにパッケージの説明を表示するドキュメントを生成させるためにも利用される。package-info.javaは、パッケージにアノテーションを付加するために作られ、従来のpackage.htmlの代替となるものである。

Java SE 6のコアパッケージ

関連項目 

 JAR（ファイルフォーマット）
 クラスパス
 Apache Harmony

外部リンク 

 
 Java Language Specification, 3rd edition: Unique Package Names
 Java Package Naming Conventions

はつけえし