2.5. java.util.AbstractSet。Set達(HashSetなど)の親クラス

AbstractSetは、Set達の親クラスです。なので、Set達はAbstractSetの子供です。

子供たちを知るには親(クラス)を見ないとわからないことがたくさんあります。

そこで、Set達の親クラスAbstractSetを見ていきたいと思います。

※ちなみに、Set達の中にはHashSet、LinkedHashSetなど、いくつもあります。

2.5.1. クラス図へ変換

では、早速クラス図にしてみましょう。

UML変換くんを実行。

> touml .\java\util\AbstractSet.java -o d:\temp\

※java1.8コード

※「-o d:temp」はクラス図の出力先です。

2.5.1.1. パッケージ図

../_images/java.util.AbstractSet.image001.jpg

パッケージ図はこれです。

AbstractSetはutil内にあり、関連するpackageはこんな感じでした。

2.5.1.2. クラス図

2.5.1.2.2. 親クラス

../_images/java.util.AbstractCollection2.svg

※AbstractCollection1はArrayListも使っています。

元の図は大きいので小さく切り取って、見ていきます。

2.5.2. 継承を眺めてみる

2.5.2.1. AbstractSet。親クラス。

../_images/java.util.AbstractSet.image002.jpg

2.5.2.1.1. AbstractCollectionを継承しています。

Collectionというのは、Setよりももっと幅の広い概念で、集めたもの集合のような意味になります。

なので、この意味に共通する処理を共有しています。つまりAbstractCollectionの処理を流用しています。

2.5.2.1.2. Setを実現しています。

Set関連のクラスは、このインタフェースを実現する設計になっています。

2.5.2.2. AbstractCollection。親の親クラス

../_images/java.util.AbstractSet.image003.jpg

2.5.2.2.1. Collectionを実現しています。

Collection関連クラスはこのインタフェースを実現することになっています。

2.5.3. フィールドを眺めてみる。

../_images/java.util.AbstractSet.image004.jpg

このクラスにはフィールドはありませんでした。

2.5.4. メソッドを眺めてみる。

2.5.4.1. コンストラクタ

#AbstractSet():void

コンストラクタです。

中の処理は空でした。

2.5.4.2. equals

+equals(o:Object):boolean

引数が自分と同じかチェックし同じならtrueを返します。

※引数oがSetの子供か、oが格納している要素が自分と同じものかなどを確認しています。

2.5.4.3. hashCode

+hashCode():int

自分のハッシュコードを取得します。

格納されている要素のハッシュコードを取得して、その合計を返していました。

※h += obj.hashCode();

2.5.4.4. removeAll

+removeAll(c:Collection<?>):boolean

引数cに含まれている要素の集合が、自分の集合内にある場合にはその要素を削除します。

2.5.5. まとめ

AbstractSetにはそれほど多くの機能は実装されていませんでした。

ちょっと面白いなと感じたのremoveAllメソッドのイテレーターの使い方でした。

for (Iterator<?> i = c.iterator(); i.hasNext(); )
    modified |= remove(i.next());

こんな風に、forループを使ってイテレーターを回していました。

私は今まで以下のようにwhileループを使って書いていましたが、for文を使った方がシンプルに書けますね。

※変数iのスコープをfor内に限定できるので良いですね。

Iterator<?> i = c.iterator()
while (i.hasNext())
    modified |= remove(i.next());

でも、さらに考えを進めると拡張for文(for each)を使った方がさらにシンプルになるのかも。

for (Iterator<?> i : c)
    modified |= remove(i.next());