第13回 静的モデル:アソシエーションのJavaの部品Javaオブジェクトモデリング

» 2003年09月18日 12時00分 公開
[浅海 智晴 ,@IT]

前回までは4回にわたって、アソシエーションに関するUMLの部品について詳細な検討を行ってきました。そもそもその目的は、UMLアソシエーションとJavaのマッピングをスムーズに実現させることにあるのですが、これがなかなか難しい作業です。以前検討した、UMLのクラスとJavaのクラスのマッピングも細かく考えていくと大変な作業でした(「第3回 静的モデル:クラスにおけるUMLとJavaのマッピング(1)」)。ですが、クラスはUMLとJavaにおいて多少の機能差があるとはいえ、同じ部品が用意されているため、UMLのみにあるモデル要素のアソシエーション(Java側には直接対応する部品がない)と比べて楽な作業であるともいえます。それでは、いよいよ今回は、Java側のアソシエーションに関する部品の検討を行っていきましょう。


3.アソシエーションに関するJavaの部品

 アソシエーションに関するJava側の部品は以下の4つです。

  • インスタンス変数
  • クラス変数
  • 配列
  • コレクションライブラリ

  基本部品となるのはインスタンス変数とクラス変数です。 多重度が2になるとインスタンス変数/クラス変数に加えて配列またはコレクションライブラリを併用します。

■■3.1 インスタンス変数とクラス変数■■

 「第4回 静的モデル:クラスにおけるUMLとJavaのマッピング(2)」で説明したとおり、UMLの属性はJavaのインスタンス変数/クラス変数にマップされます。 そしてこれまでの説明で、属性だけでなくアソシエーションもインスタンス変数/クラス変数にマップされることが分かりました。 つまり、Javaプログラムで普通に利用されているインスタンス変数/クラス変数を、逆にUMLにマップする場合、属性とアソシエーションの両方が選択肢となるわけです。

■■3.2 配列■■

 Javaの配列はUMLでは、属性またはアソシエーション・エンドの多重度として表現されることになります。配列に格納されているオブジェクトによって属性またはアソシエーション・エンドのどちらになるか決まります。

■■3.3 コレクション■■

 Javaのコレクション機能は図1に示すCollection系のクラスと、図2に示すMap系のクラスから構成されます。大枠ではCollection系は多重度に、Map系は限定子に対応します。

ALT 図1 Javaコレクションライブラリ/Collection系
ALT 図2 Javaコレクションライブラリ/Map系

●3.3.1 Collection

 java.util.Collectionは図1に示すCollection系のコレクション機能の基本となるインターフェイスです。java.util.Collectionには以下のサブインターフェイスがあります。

  • java.util.List
  • java.util.Set
  • java.util.SortedSet

 java.util.Collectionとして以下の実装クラスが標準で用意されています。

  • java.util.ArrayList
  • java.util.LinkedList
  • java.util.Vector
  • java.util.Stack
  • java.util.HashSet
  • java.util.TreeSet

 なお、java.util.Vectorは過去との互換性のために用意されているクラス、java.util.Stackはjava.util.Collectionとしてはあまり意味を持たないクラスなので、アソシエーション・エンドの多重度を実装する目的という意味では、以下のクラスが選択肢となってきます。

  • java.util.ArrayListは、配列の機能のうえにjava.util.Listを実装した具象クラスです。全般的に良い性能を出します。
  • java.util.LinkedListは、リンクを使ってjava.util.Listを実現した具象クラスです。要素の挿入や削除の実行速度が速い、ことが特徴です。
  • java.util.HashSetは、ハッシュ法を用いて値の重複を検出する機能を持つjava.util.Setの具象クラスです。
  • java.util.TreeSetは、バイナリツリーを用いて値の重複を検出する機能と値の順番に整列させる機能を両立させたjava.util.Sortedの具象クラスです。

 Javaでの実装においては、以上の実装クラスを目的に応じて使い分けることになります。 もちろん用途に応じて、これら以外の実装クラスを自作したり、ほかのクラスライブラリのものを利用する必要も出てきます。

●3.3.2 List

 java.util.Listとして以下の実装クラスが標準で用意されています。

  • java.util.ArrayList
  • java.util.LinkedList
  • java.util.Vector
  • java.util.Stack

 前述したとおりjava.util.Vectorとjava.util.Stackは、UMLの多重度をマッピングする目的にはあまりふさわしくないので、選択肢は以下の2つになります。

  • java.util.ArrayList
  • java.util.LinkedList

 java.util.ArrayListjava.util.LinkedListの機能は前述したとおりです。

●3.3.3 Set

 java.util.Setとして以下の実装クラスが標準で用意されています。

  • java.util.HashSet
  • java.util.TreeSet

 java.util.HashSetjava.util.TreeSetの機能は前述したとおりです。

●3.3.4 SortedSet

 java.util.SortedSetとして以下の実装クラスが標準で用意されています。

  • java.util.TreeSet

 java.util.TreeSetの機能は前述したとおりです。

●3.3.5 Map

 java.util.Mapは図2に示すMap系のコレクション機能の基本となるインターフェイスです。java.util.Mapとして以下の実装クラスが標準で用意されています。

  • java.util.HashMap
  • java.util.TreeMap
  • java.util.WeakHashMap
  • java.util.IdentityHashMap
  • java.util.Hashtable
  • java.util.Properties

 なお、java.util.Hashtableは過去との互換性のために用意されているクラス、java.util.Properties、java.util.WeakHashMap、java.util.IdentifyHashMapの3つのクラスはjava.util.Collectionの機能よりも幅広い機能を持っているので、UMLの限定子をマッピングする目的にはあまりふさわしいクラスとはいえません。このため事実上の選択肢は以下の2つとなります。

  • java.util.HashMapは、ハッシュ法を用いて値の検索を行う機能を持つjava.util.Mapの具象クラスです
  • java.util.TreeMapは、バイナリツリーを用いて値の検索を行う機能と値の順番に整列させる機能を両立させたjava.util.SortedMapの具象クラスです

 Javaでの実装においては、以上の実装クラスを目的に応じて使い分けることになります。もちろん用途に応じて、これら以外の実装クラスを自作したり、ほかのクラスライブラリのものを利用する必要も出てきます。

●3.3.6 SortedMap

 java.util.SortedMapとして以下の実装クラスが標準で用意されています。

  • java.util.TreeMap

 java.util.TreeMapの機能は前述したとおりです。

■■3.4 Java部品のまとめ■■

 以上、アソシエーションに関連するJava部品をまとめました。UMLのアソシエーションをJavaで実装するうえでの基本部品は、インスタンス変数とクラス変数です。アソシエーション・エンドの部品である多重度の実装には配列またはCollection系のコレクションライブラリを使用します。また、限定子の実装にはMap系のコレクションライブラリを使用します。


 次回はこれらの部品を組み合わせて、Javaプログラムを前提としたUMLアソシエーションのプロファイルについて考えていきましょう。

Copyright © ITmedia, Inc. All Rights Reserved.