パッケージの利用

Copyright(C) 18Sep2013 coskx

クラスは1つのファイルに1つだけ記述されるのがふつうである。
そうすると,大規模なアプリケーション開発になると,ソースファイルが非常にたくさんできてしまう。
通常多くのファイルはフォルダを利用して整理する。フォルダが異なれば同じ名前のファイルを置くこともできる。
このフォルダ構造に従って整理されたソースファイルをコンパイルして実行できるようにする仕組みがパッケージである。
複数開発者によるアプリ開発では,他の開発者の作成中のクラスを自分の開発中のクラスに取り込みながら開発することになるが,
このような場合,バージョンの異なる同じクラス(当然同じファイル名)が使われることになる。
その時,パッケージの仕組みを用いると,複数のクラスの差し替えが瞬時に可能となる,

Javaでは一連のソースファイルが保存されているフォルダの名前とパッケージの名前は一致させることになっている。


例1 1つのパッケージの1つのクラスを使う
   package1.zip

作業フォルダ
 |
 |--- Classtestmain.java (実行メインのあるクラス) 
 |
 |--- フォルダ phello1
         |
         |--- Hello.java (実行メインから呼び出されるクラス)

Classtestmain.java
/* Classtestmain.java */
import phello1.*;

public class Classtestmain {
    public static void main(String[] args) {
        Classtestmain mainprg = new Classtestmain();
    }
 
    Classtestmain() {
        Hello pH= new Hello();
        pH.print();
    }
}


phello1\Hello.java
/* Hello.java */
package phello1; //この行は省略不可

public class Hello { //このpublicは省略可能
    public void print() {
        System.out.println("Hello, from phello1.hello");
    }
}


実行結果
>javac Classtestmain.java

>java Classtestmain
Hello, from phello1.hello


Classtestmain.javaが,phello1\Hello.javaのクラスHelloのインスタンスを作ってprint()を呼び出し,
Hello, from phello1.hello」を表示させた。

import phello1.*;
は,パッケージphello1のすべてのクラスを取り入れて使うという意味である。この例では

import phello1.hello;
と書いて,
パッケージphello1のクラスHelloを取り入れて使うとしてもよい。
phello1」はフォルダ名でもある。

package phello1;
は,このファイル(
phello1\hello.java)はパッケージphello1に属しますという意味である。
この記述をせずにファイルが単にフォルダphello1に入っているだけでは,
パッケージphello1のファイルとはみなされない。


ただし,実際の作業では上記の実行の前に,作業フォルダに移動している必要がある

例えば作業フォルダが

C:\Users\xxx\work

の時は

cd C:\Users\xxx\work

とする。次に環境変数を整える(この例はwindowsの環境変数を自動的に整えるためのコマンドである)

for /F %i in ( 'dir "C:\Program Files\Java" /b ^| find "jdk"' ) do (set CURRENTJAVA=%i)
set CLASSPATH=.;"%SystemDrive%\Program Files\Java"
set JAVAPATH="%SystemDrive%\Program Files\Java\%CURRENTJAVA%\bin"
set path=%path%;%JAVAPATH%
set JAVA_HOME="%SystemDrive%\Program Files\Java\%CURRENTJAVA%"

この作業を行った後にコンパイルと実行を行う。

クラスPointを持つPoint.javaを探してコンパイルしてリンクして実行してくれる。と説明したが,
環境変数CLASSPATHに記述されたフォルダを探す仕組みになっている。
ここでは,CLASSPATHに「.」(カレントフォルダ)が含まれているので,探してくれた。


例2 2つのパッケージのそれぞれに同じ名前のクラスがあり,差し替える   package2.zip

作業フォルダ
 |
 |--- Classtestmain.java (実行mainのあるクラス) 
 |

 |--- フォルダ phello1
 
       |
 
       |--- Hello.java (実行mainから呼び出されるクラス)
 
 
 |--- フォルダ phello2
         |
         |--- Hello.java (実行mainから呼び出されるクラス)
        

同じ名前のHello.javaが2か所にある。どちらのHello.javaを使うのか指定するときに,このpackageを利用することができる。


Classtestmain.java
/* Classtestmain.java */
import phello2.*;

public class Classtestmain {
    public static void main(String[] args) {
        Classtestmain mainprg = new Classtestmain();
    }
 
    Classtestmain() {
        Hello pH= new Hello();
        pH.print();
    }
}


phello1\Hello.java
/* Hello.java */
package phello1; //この行は省略不可

public class Hello { //このpublicは省略可能
    public void print() {
        System.out.println("Hello, from phello1.hello");
    }
}


phello2\Hello.java
/* Hello.java */
package phello2; //この行は省略不可

public class Hello { //このpublicは省略可能
    public void print() {
        System.out.println("Hello, from phello2.hello");
    }
}


実行結果
>javac Classtestmain.java

>java Classtestmain
Hello, from phello2.hello

Classtestmain.java中にて,例1におけるimport phello1.*;をimport phello2.*;に差し替えている。
import phello2.*;
は,パッケージphello2のすべてのクラスを取り入れて使うという意味である。
そのため,パッケージphello1は使われず,パッケージphello2のクラスhelloが使われたことが実行結果よりわかる。
もう一度,
Classtestmain.javaの最初のところをimport phello1.*;に戻すと例1のような結果となる。