連載

Javaオブジェクトモデリング

第15回
UMLアソシエーションの詳細解説
静的モデル:
「順序付け」から「インターフェイス指定子」まで

浅海智晴
2003/11/19

 Javaプログラムを前提としたUMLアソシエーションのプロファイルについて、前回「第14回 静的モデル:Javaを前提としたUMLアソシエーション」はマッピングの方針を明らかにして全体の方向性を示し、マッピングに必要な部品の説明を行い、「集約」「多重度」まで解説しました。今回は「順序付け」「変更可能性」「限定子」「インターフェイス指定子」まで解説を行います。

4.1 方針
4.2 変数のマッピング
4.3 必須の部品
4.4 集約
4.5 多重度

4.6 順序付け
4.7 変更可能性
4.8 限定子
4.9 インターフェイス指定子

4.10 配列
4.11 Collection
4.12 List
4.13 Set
4.14 SortedSet
4.15 Map
4.16 SortedMap
4.17 プロファイルのまとめ

編集局より 【連載】Javaオブジェクトモデリング は第15回目より、DevelopmentStyleからJavaSolutionに移管しました。

■■4.6 順序付け■■

 順序付けの使い方はUMLの通常の使い方に沿っています。Javaでのマッピングはjava.util.Listとjava.util.SortedSetが軸です。

●4.6.1 UMLでの表現

 順序付けを表現するために、制約orderedと制約sortedを使用します。図1の左側が制約orderedを使った場合、右側が制約sortedを使った場合です。

図1 プロファイル/順序付け(クリックで拡大)

 また、Javaでの実装との連携を目的として以下の独自タグ付き値を導入します。

    collectionClass

 タグ付き値collectionClassは、制約orderedまたは制約sortedを実現するためのコレクションの実装クラスを指定します。以上のタグ付き値を使用したアソシエーションはこの目的のため、図2のようになります。

図2 順序性の独自タグ付き値(クリックで拡大)

 また、省略形としては制約orderedおよび制約sortedをタグ付き値的に利用し、図2の下側のように実装クラスを定義することも可能です。この表記は、本来はUMLの文法違反ですが、ドローツールなどでUMLを記述している場合には、このような略記法があってもよいと思います。

●4.6.2 Javaでの実装/制約ordered

 制約orderedは以下のルールでマップします。

    型としてインターフェイスjava.util.Listを使用する

    実装クラスのデフォルトとしてクラスjava.util.ArrayListを使用する

    実装クラスを指定したい場合は独自タグ付き値collectionClassで指定する

 このルールに沿って図1を実現したJavaプログラムは以下のようになります。

import java.util.List;
import java.util.ArrayList;

public class Company {
    private List employee = new ArrayList();
}
リスト1 順序付け/orderd

 また、図2に示した独自タグ付き値を実現したJavaプログラムは以下のようになります。タグ付き値collectionClassで実装クラスとしてjava.util.LinkedListを指定した場合です。インスタンス変数の型には java.util.Listが使用されます。

import java.util.List;
import java.util.LinkedList;

public class Company {
    private List employee = new LinkedList();
}
リスト2 順序付け/ordered/collectionClass

●4.6.3 Javaでの実装/制約sorted

 制約sortedは以下のルールでマップします。

    型としてインターフェイスjava.util.SortedSetを使用する

    実装クラスのデフォルトとしてクラスjava.util.TreeSetを使用する

    実装クラスを指定したい場合は独自タグ付き値collectionClassで指定する

 このルールに沿って図1を実現したJavaプログラムは以下のようになります。

import java.util.SortedSet;
import java.util.TreeSet;

public class Company {
    private SortedSet employee = new TreeSet();
}
リスト3 順序付け/sorted

 また図2示した独自タグ付き値を実現したJavaプログラムは以下のようになります。タグ付き値collectionClassで実装クラスとしてcom.example.MySortedSetを指定した場合です。インスタンス変数の型にはjava.util.SortedSetが使用されます。

import java.util.SortedSet;
import com.example.MySortedSet;

public class Company {
    private SortedSet employee = new MySortedSet();
}
リスト4 順序付け/sorted/collectionClass

■■4.7 変更可能性■■

 変更可能性は多重度が2以上の場合、マッピングが難しくなります。このため、本プロファイルでは使用方法を定義しません。補助的な使用にとどめておきます。

■■4.8 限定子■■

 限定子もUMLの通常の使い方に沿っています。Javaでのマッピングはjava.util.Mapが軸となります。

●4.8.1 UMLでの表現

 限定子を使ったアソシエーションは図3に示すように表現します。

図3 プロファイル/限定子(クリックで拡大)

 Javaとのマッピングを前提とすると限定子に指定する属性は、型が明確になっていなければなりません。ただし、限定子の型としては文字列(java.lang.String)が使われるケースが圧倒的に多いので、文字列の場合は省略可能とします。限定子の属性型はプリミティブ型かバリューオブジェクトのみとします。また、Javaでの実装との連携を目的として以下の独自タグ付き値を導入します。

    collectionClass

 タグ付き値collectionClassは、限定子を実現するためのコレクションの実装クラスを指定します。

●4.8.2 Javaでの実装

 本プロファイルではUMLの限定子を以下のルールでJavaにマップします。

    型としてインターフェイスjava.util.Mapを使用する

    実装クラスのデフォルトとしてクラスjava.util.HashMapを使用する

    実装クラスを指定したい場合は独自タグ付き値collectionClassで指定する

 図3を実現したJavaプログラムは以下のようになります。

import java.util.Map;
import java.util.HashMap;

public class Company {
    private Map employee = new HashMap();
}

リスト5 限定子

 また図3の右側に示した独自タグ付き値を実現したJavaプログラムは以下のようになります。タグ付き値collectionClassで実装クラスとしてcom.example.MyMapを指定した場合です。インスタンス変数の型には java.util.Mapが使用されます。

import java.util.Map;
import com.example.MyMap;

public class Company {
    private Map employee = new MyMap();
}

リスト6 限定子/collectionClass

■■4.9 インターフェイス指定子■■

 インターフェイス指定子の使い方も、UMLの通常の使い方に沿っています。Javaでのマッピングはインスタンス変数またはクラス変数の型として実装されます。

●4.9.1 UMLでの表現

 インターフェイス指定子を使ったアソシエーションは図4に示すように表現します。

図3 プロファイル/インターフェイス指定子

●4.9.2 Javaでの実装

 図1を実現したJavaプログラムは以下のようになります。

public class Company {
    private IEmployee employee;
}

リスト7 インターフェイス指定子

 インターフェイスIEmployeeとクラスPersonには図5に示すようにリアライゼーション(実現:realization)のリレーションシップがなければなりません。

図5 インターフェイス指定子関連のクラス

 いうまでもありませんが、この関係をJavaにマップすると以下のようにクラスPersonがインターフェイスIEmployeeをimplementsする形で実装されます。

public class Person implements IEmployee {
}

 次回は今回の続きとして「4.10 配列」から解説していきます。

Javaオブジェクトモデリング INDEX


Java Solution全記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間