Javaに関する様々な情報をご紹介します。

2パッケージの作成

Javaに関する様々な情報をご紹介します。

パッケージの作成

このページではパッケージの作成方法について説明します。

パッケージの作成方法

パッケージの作成は以下の枠内のフォーマットにより構成されます。パッケージに含めたいクラス・インタフェースが定義されているソースファイルの先頭でpackage文を宣言します。パッケージのスコープはソースファイル全体になります。そのため、ソースファイルにクラス・インタフェースが複数書かれている場合はそれらすべてがパッケージに含まれます。

package パッケージ名;

例1

//クラスExPackageをパッケージPackageAに含めます。
package PackageA;

public class ExPackage {
    public void showName() {
        System.out.println("PackageAに属します。");
    }
}

ソースファイル作成時、packageを宣言しない場合、そのソースファイルで宣言されたクラス・インタフェースはデフォルトパッケージに含まれます。デフォルトパッケージとは名前を持たないパッケージを言います。デフォルトパッケージは非常に小規模なプログラムや開発環境で使われるものです。プログラムを体系的に整理するためにも各ソースファイルの先頭でpackage文を宣言することが推奨されます。

パッケージのネーミング規則

プログラムの配布を考える時、そのプログラムで宣言されているパッケージ名が他のプログラムのパッケージ名と重複しないとは限りません。パッケージ名が重複してしまうとせっかくのパッケージの利点であるクラス名、インターフェース名の重複排除が侵害されてしまいます。

パッケージ名が重複しないようにネーミング規則の慣例があります。プログラマが属する会社や組織のインターネットドメイン名を使用すると言うものです。例えば、ある会社のドメイン名がAAA.co.jpであるとパッケージ名はjp.co.AAA.packageAなどとなります。

独自ドメインを持っていない場合は以下のURLからパッケージ名の登録を行うことができます。
http://www.java-conf.gr.jp/wg_bof/package/

パッケージのアクセスレベル

クラス、メンバ変数、メソッド、コンストラクタにアクセスレベルを付与することにより、パッケージ外からのアクセスを制限することができます。セキュリティを考慮し、必要でない場合以外はパッケージ外からのアクセスを制限すべきです。

クラス
publicアクセスレベルが付与されている場合のみ、そのクラスをパッケージ外から使用できます。デフォルト(無指定)の場合、パッケージ外からは使用できません。
メンバ変数、メソッド、コンストラクタ
publicアクセスレベルが付与されている場合のみ、パッケージ外から使用できますがprotected、デフォルト(無指定)、privateアクセスレベルが付与されている場合、パッケージ外からは使用できません。
※ protectedアクセスレベルはサブクラスからは、パッケージ外からでも使用可能です。詳細はアクセスレベルを参照してください。

【例2】publicでないクラスをパッケージ外から使用できない例です。

PackageA/ExPackage2A.javaファイル

package PackageA;  //(1)パッケージPackageAの定義

class ExPackage2A { //(2)publicでないクラスExPackage2Aの定義
    public void showClass() {
        System.out.println("クラスExPackage2Aです。");
    }
}

PackageB/ExPackage2B.javaファイル

package PackageB;  //(3)パッケージPackageBの定義

import PackageA.ExPackage2A;  //(4)

public class ExPackage2B {  //(5)
    public static void main(String[] args) {
        ExPackage2A ex = new ExPackage2A();  //(6)
        ex.showClass();
    }
}

解説2

  1. (1)パッケージPackageAを定義します。
  2. (2)publicアクセスレベルが付与されないクラスExPackage2Aを定義します。
  3. (3)パッケージPackageBを定義します。
  4. (4)PackageAに属するExPackage2Aクラスをインポートします。
  5. (5)クラスExPackage2Bを定義します。
  6. (6)クラスExPackage2Aのオブジェクトexを生成します。

実行結果2

D:\JAVA>javac PackageB/ExPackage2B.java
PackageB/ExPackage2B.java:3: PackageA の PackageA.ExPackage2A は public ではあり ません。パッケージ外からはアクセスできません。
import PackageA.ExPackage2A;
            ^
PackageB/ExPackage2B.java:7: PackageA の PackageA.ExPackage2A は public ではあり ません。パッケージ外からはアクセスできません。
  ExPackage2A ex = new ExPackage2A();
   ^
PackageB/ExPackage2B.java:7: PackageA の PackageA.ExPackage2A は public ではあり ません。パッケージ外からはアクセスできません。
  ExPackage2A ex = new ExPackage2A();
   ^
PackageB/ExPackage2B.java:7: PackageA.ExPackage2A の ExPackage2A() は public で はありません。パッケージ外からはアクセスできません。
  ExPackage2A ex = new ExPackage2A();
   ^
PackageB/ExPackage2B.java:8: PackageA.ExPackage2A の showClass() は public クラ スまたはインタフェースでは定義されません。パッケージ外からはアクセスできません。
   ex.showClass();
    ^
エラー 5 個

D:\JAVA>

【例3】publicクラスをパッケージ外からでも使用できる例です。

PackageA/ExPackage2A.javaファイル

package PackageA;  //(1)パッケージPackageAの定義

public class ExPackage2A { //(2)publicなクラスExPackage2Aの定義
    public void showClass() {
        System.out.println("クラスExPackage2Aです。");
    }
}

PackageB/ExPackage2B.javaファイル

package PackageB;  //(3)パッケージPackageBの定義

import PackageA.ExPackage2A;  //(4)

public class ExPackage2B {  //(5)
    public static void main(String[] args) {
        ExPackage2A ex = new ExPackage2A();  //(6)
        ex.showClass();  //(7)
    }
}

解説3

  1. (1)パッケージPackageAを定義します。
  2. (2)publicアクセスレベルが付与されたクラスExPackage2Aを定義します。
  3. (3)パッケージPackageBを定義します。
  4. (4)PackageAに属するExPackage2Aクラスをインポートします。
  5. (5)クラスExPackage2Bを定義します。
  6. (6)クラスExPackage2Aのオブジェクトexを生成します。
  7. (7)クラスExPackage2AのshowClassメソッドを実行します。

実行結果3

D:\JAVA>javac PackageB/ExPackage2B.java

D:\JAVA>java PackageB/ExPackage2B
クラスExPackage2Aです。

D:\JAVA>

2パッケージの作成