java.utilパッケージのutilはUtility、すなわちいろいろと便利に使えるクラスがそろっています。これらのクラスは独立してパッケージに分けるほどボリュームはなく、一見すると雑多な印象を受けられると思います。その雑多なクラスを大別してみると表 1のようになります。それぞれを簡単に紹介していきます。
種類 | 概要 | 代表的なクラス |
---|---|---|
コレクション | オブジェクトの集まりを表すクラス | Collection, List, Map, Set, ArrayList, HashMap |
時間 | 時間や日付を表すクラス | Date, Calendar, GregorianCalendar |
ローカライズ | ローカライズに関連したクラス | Locale, TimeZone, Currency |
国際化 | 各国語対応を行うためのクラス | ResourceBundle, ListResourceBundle |
オブザーバーパターン | オブザーバーパターンとイベント配信のためのクラス | Observer, Observable, EventListener, EventObject |
タイマー | タイマー | Timer, TimerTask |
その他 | Random, StringTokenizer, BitSet |
インタフェース名 | 順序 | 重複 | キーによるアクセス |
---|---|---|---|
List | 格納順 | あり | なし |
Set | なし | なし | なし |
SortedSet | 整列順 | なし | なし |
Map | なし | なし | あり |
SortedMap | 整列順 | なし | あり |
コレクションはオブジェクトの集まりを扱うためのクラス群です。JavaのコレクションはJava Collections Framework (JCF)で定義されています。java.utilパッケージの中では例外的に多くのインタフェースとクラスが定義されていますが、もともとVectorなどがjava.utilパッケージにあったためjava.utilパッケージに残されているようです。
JCFではインタフェースと実装が明確に分けられています。インタフェースは図1に示すように6種類ありますが、Collectionインタフェースを直接使うことはほとんどないため、実質は5種類です。インタフェースの比較を表 2に示します。機能が分かれているので、使い分けが容易になっています。
実装クラスは14種類あり、大別するとJDK 1.0からのクラス、特殊用途のクラス、それ以外の3種類に分けられます。例えば、VectorクラスはJDK1.0からのクラスで、Propertiesクラスは特殊用途のクラスです。それぞれの用途に応じた実装クラスを選択することがコレクションを使いこなすポイントの1つになります。
この他にシーケンシャルアクセスのためのIterationインタフェース、またユーティリティクラスのArrays, Collectionsクラスなどがあります。
時間に関するクラスにはDateやCalendarなどがあります。Dateクラスは時刻を表すクラスで、それをタイムゾーンやロケールなどにより年、日、時などに解釈するのがCalendarクラスです。Calendarクラスは抽象クラスで、暦の種類により実装クラスを作る必要があります。標準ではグレゴリオ歴に対応するGregorianCalendarクラスが提供されています。
ローカライズに関するクラスにはLocaleクラスとTimeZoneクラスがあります。日本はロケールだけで地域を特定できますが、アメリカのように1つのロケールに複数のタイムゾーンがある場合もあるため、2つのクラスを使用してローカライズを行います。TimeZoneクラスは夏時間も表すことが可能です。通常はデフォルトのロケ-ルとタイムゾーンを使用することが多いと思いますが、明示的に指定することも可能です。
Currencyクラスは通貨を表すクラスです。通貨はロケールによって異なりますが、Currencyクラスを使用することで統一的に扱うことができます。
アプリケーションのメニューやボタンなどの文字列はリソースとして扱うことができますが、国際化を行うにはリソースを使用する言語すなわちロケールによって切り替える必要があります。リソースとプログラムを別々にしておけば、ロケールに依存しないアプリケーションを容易に作成できます。ResourceBundleクラスはこのようにリソースをプログラム本体から独立させるために使用されます。
リソースの定義には、クラスとして定義する方法とプロパティファイルで定義する方法があります。クラスとしてリソースを定義するにはResourceBundleクラスの派生クラスListResourceBundleがよく使用されます。リソースの切り替えは、ロケールに対応する派生クラスを使用して行います。プロパティファイルでリソースを定義する場合にも、ロケールに応じたプロパティファイルを使用します。
オブザーバパターンはGoF (Gang of Four)によるデザインパターンの中の 1 つのパターンです。JavaではこのパターンをObserverインタフェースとObservableクラスで実現できます。また、オブザーバパターンの一種と考えることもできるイベントもjava.utilパッケージで定義されています。Observableに相当するクラスはないのですが、Observerインタフェースに相当するのがEventListenerインタフェースです。EventListenerインタフェースは様々なリスナーインタフェースのスーパーインタフェースとなります。同様にEventObjectクラスは様々なイベントクラスのスーパークラスになります。
独自にイベントを作成する場合もEventObjectクラスとEventListenerインタフェースを派生させて使用するようにします。
決められた時間に行う処理や、定期的に繰り返し行う処理を扱うクラスがTimerクラスです。Timerクラスで行わせる処理はTimerTaskクラスを派生させて記述するようにします。Swingにも同名のクラスがありますが、SwingのTimerクラスがGUIに特化しているのに対し、java.utilパッケージのTimerクラスは汎用に使用できるようになっています。
その他のクラスとしては乱数を扱うRandomクラス、文字列をトークンに分解するStringTokenizer、複数のビットを扱うためのBitSetなどがあります。
参考文献: 「オブジェクト指向における再利用のための デザインパターン」, Erich Gamma 他, ソフトバンク, ISBN 4-7973-1112-6
(2002.09)