Headline About TechLog Download Java VBA Link


June 15, 2007. Friday.

Javaの格言:職員室で先生!

職員室に入って「先生!」と叫んではいけない。最悪全員が振り向くからだ。そして「誰を呼んどるのか判らんわ!」とお叱りを受けることになる。これは先生を呼ぶ時の失敗としては、「お母さん!」と叫ぶ事の次ぐらいに恥ずかしい。一方、自分の教室で「先生!」と呼んで怒られることは無い。これは「ある教室内である」と言う事実が先生、という呼称が誰を指すかを暗黙的に決定するからである。

javaにおいて教室の役割をするのがpackageである。非常に大切な概念であるにもかかわらず、大抵の書籍のサンプルプログラムはデフォルトパッケージで作業をしていたりする。これは非常によろしくない。


最悪な事態を紹介しよう。A君はデータを整形するクラスFormaterを作りexecute()メソッドを作った。C君はA君の作ったFormater#execute()を呼び出してデータを整形しようとした....が、何故かDドライブのデータが全て消えてしまった。実はコンパイルパスが間違っていて、B君の作ったHDをフォーマットするメソッドFormater#execute()を呼んでしまったのだった...。


上記のようなことはまず起きないが、package名を決めず開発を行い、結合しようとした際に、クラス名がかぶってコンパイルできない、なんてことはよく起こる。それを防ぐためには前もってpackage階層を決めておき、そこにクラスを格納すればよいのである。しかし、他社製品とpackageが被ることはないのだろうか?packageを一意にするためのルールを一体誰が管理すればよいのか?

javaではpackageを一意にする為に、開発者(社)の持つドメインを逆順に表記する、と言う手法を取っている。例えば、このサイトのアドレスはhttp://sdls.net/~barista/tech/なので、baristaの作るクラスは全てnet.sdls.barista.tech package以下に格納する。ドメイン名は世界で一意なので、この方法で前述の問題は回避できる。「java.io」のようにドメイン名の逆順以外のpacakageの使用はSunだけの特権である。なのでどうしても自由にパッケージ名をつけたい人はSunに就職する所からはじめて頂きたい


ちなみに「一般公開せず自分だけが使うからパッケージなんか不要」という意見が非常に多いので軽く反駁しておく。例えばこんなツールクラスを作ったとする。

// パッケージなし
public class StringTool {
  public static String concat(String a, String b) {
    return a + ":" + b;
  }
}

次に上記のツールを利用した別ツールクラスをtools package内に作ったとする。

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すればいいのだが...????そう、packageに属さないクラスはimportすらできないのである。したがって、自分だけが使う場合でも最低限packageは作っておかないと、全く再利用が出来ない事があるのである。無論、そこまでわかった上でパッケージ無しのクラスを作ることは良くある。あくまで知らない人の為の解説なので柔軟に解釈して欲しい。