職員室で先生!

 職員室に入って「先生!」と呼んではいけない。最悪全員が振り向くことになる。そして「誰先生をよんどるのか判らんわ!」とお叱りを受けて恥ずかしい目にあうことになる。これは先生を呼ぶ際の恥ずかしさとしては、間違って「お母さん」と言ってしまう事の次ぐらいに厳しい。一方、自分の教室で先生を「先生!」と読んで怒られることは無い。これは「ある教室内である」と言う事実が先生、という呼称がどの個人を指すかを暗黙的に示唆するからである。
 javaにおいて教室の役割をするのがpackageである。非常に大切な概念であるにもかかわらず、大抵の書籍のサンプルプログラムはデフォルトパッケージで作業をしていたりする。これは非常によろしくない。
 最悪な事態を紹介しよう。A君はデータを整形するクラスFormatを作りexecute()メソッドを定義した。C君はA君とB君の作ったモジュールを利用してあるアプリを作った。そしてFormat#execute()を呼び出したところ....何故かDドライブのデータが全て消えてしまった。そう、C君はハードディスクをフォーマットする為のクラスFormatを作りexecute()メソッドを定義していたのだった...。(※Formatというクラスのネーミングセンスがそもそも論外ではあるが)
 こういうことは往々にして起こる。実際には誤動作よりは、コンパイル時に名前が被っているからコンパイルできない、と言う問題に直面することの方が多い。こういう問題を避けるにはどうすればよいか。一意なpackageにクラスを格納しておけばいいのである。
 javaではこの「一意」を実現する為に開発者の持つドメインを逆順に表記する、と言う手法を取っている。例えば、このサイトはhttp://www.sdls.jp/~barista/なので、baristaの開発するクラスは全てjp.sdls(.www).barista以下に格納するように作るのだ。ドメイン名は世界で一意なので、この方法で他人とパッケージ名が被るのを回避可能である。このドメイン名の逆順以外のパッケージ名をつけていいのは、javaの開発元であるSUNだけの特権である。なので自由にパッケージ名をつけたい人はSUNに就職する所からはじめて頂きたい。これもコーディング規約に書いてあるのだが、意外とみんな知らない。
 ちなみにMicrosoftはcom.msというパッケージを使っているが、www.ms.comはマイクロソフトの持ち物ではない。同じ事をappleもやっていたようだ。これは女の子が他人の家に上がりこんで、そこの家のお父さんを「パパ〜」と呼ぶぐらい酷い行為である。恐ろしさを感じていただけただろうか。

 ちなみに「一般公開せず自分だけが使うからパッケージなんか不要」という意見が非常に多いので軽く反駁しておく。例えば、
// パッケージなし
public class StringTool {
    public static String concat(String a, String b) {
        return a + ":" + b;
    }
}
こんなクラスを作っていたとする。
ある日、packageを作ってこんなToolクラスを作ったとする。
package tools;
public class Tool {
    public static String concatThree(String a, String b, String c) {
        return StringTool.concat(StringTool.concat(a, b), c);
    }
}
 一見良さそうだが実はコンパイルが通らない。StringToolがtoolsパッケージに無いからだ。こういうときは当然、import文でimportすればいいのだが...????そう、packageに属さないクラスはインポートできないのである。したがって、自分だけが使う場合でも最低限packageは作っておかないと、全く再利用が出来ないのである。
 無論、そこまでわかった上でパッケージ無しのクラスを作ることは良くある。あくまで知らない人の為の解説なので知ってた人は気にしないで頂きたい。

戻る

Copyright (c) 2004 barista All rights reserved.