2.6. java.util.AbstractCollection。要素の集合の祖先クラス。

AbstractCollectionは要素集合の祖先のクラスです。

ArrayListやHashSetなど要素の集まりを扱うクラスの祖先のクラスです。

なので、親の親クラスあたりでこのクラスを継承しています。

そんな、AbstractCollectionを眺めていきます。

2.6.1. クラス図へ変換

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

UML変換くんを実行。

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

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

> touml .\java\lang\Iterable.java -o d:\temp\

※java1.8コード

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

2.6.1.1. パッケージ図

../_images/java.util.AbstractCollection.image001.jpg

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

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

2.6.2. 継承を眺めてみる

2.6.2.1. AbstractCollection。ターゲットのクラス

../_images/java.util.AbstractCollection.image002.jpg

2.6.2.1.1. Collectionインタフェースを実現しています。

Collectionインタフェースは要素の集合を扱うクラスはこれを実現することになっています。

ですので、実現するクラスAbstractCollectionではCollectionのメソッドを基本すべてオーバーライドして実装します。

2.6.2.2. Collection。親のインタフェース

../_images/java.util.AbstractCollection.image003.jpg

2.6.2.2.1. Iterableインタフェースを継承しています。

Iterableインタフェースはイテレーター(iterator)を処理する機能を持つクラスが実現するインタフェースになります。

Collectionは要素の集まりを扱いますので、イテレーターが必要になります。

※iterator:反復子、繰り返し処理に使うもの(= iterate:繰り返す +or:使うもの)

2.6.2.3. Iterable。親の親のインタフェース

../_images/java.util.AbstractCollection.image004.jpg

これは、何も継承していないのでこれで最後です。

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

../_images/java.util.AbstractCollection.image005.jpg

2.6.3.1. MAX_ARRAY_SIZE

-MAX_ARRAY_SIZE:int=Integer.MAX_VALUE-8{readOnly}

AbstractCollectionに格納できる配列の最大数。

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

2.6.4.1. 親の親クラスAbstractCollection

2.6.4.1.1. コンストラクタ

#AbstractCollection():void

このへんは、コンストラクタです。処理はありません。

2.6.4.1.2. iterator

+iterator():Iterator<E>

これは、イテレーターの取得です。オーバーライドします。

2.6.4.1.3. size

+size():int
+isEmpty():boolean

サイズ(配列の要素数)を取得したりします。

sizeはオーバーライドしなければいけません。

isEmptyはsize()をコールして0だったらtrueを返しているだけです。

2.6.4.1.4. contains

+contains(o:Object):boolean

引数がoが配列内に含まれているかチェックします。

2.6.4.1.5. toArray

+toArray():Object[]
<T>+toArray(a:T[]):T[]
<T>-finishToArray(r:T[],it:Iterator<?>):T[]
-hugeCapacity(minCapacity:int):int

toArray内部配列の要素をコピーして返却する処理です。

つまり、Collectionから配列に変換しています。

引数a:T[]はサイズが足りていれば、これに配列コピーして戻り値として返します。

足りないときにはjava.lang.reflect.Array.newInstanceで新規に作った配列にコピーして返します。

2.6.4.1.6. add

+add(e:E):boolean

これは、常に例外UnsupportedOperationExceptionを投げます。

自分でオーバーライドしろということでしょう。

2.6.4.1.7. remove

+remove(o:Object):boolean

内部配列内に引数o:Objectを探して、有れば最初の一つを削除します。

2.6.4.1.8. containsAll

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

引数cの集合が内部配列にあるかチェックします。

2.6.4.1.9. addAll

+addAll(c:Collection<?extends E>):boolean

引数の集合cを内部配列に追加します。

2.6.4.1.10. removeAll

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

引数cの集合を内部配列からすべて削除しています。

2.6.4.1.11. retainAll

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

ちょうど、removeAllと逆の仕様になっています。

引数cの集合を内部配列に確保(retain)し、それ以外はすべて削除しています。

2.6.4.1.12. clear

+clear():void

内部配列を消し(clear)て空にします。

2.6.4.1.13. toString

+toString():String

内部の要素を文字列として吐き出します。

例:"[1 ,2 ,3 ,4]"

2.6.5. まとめ

AbstractCollectionはCollection仲間の親クラスになります。

要素の集合を扱う操作が集められて実装されています。

これを継承することで要素の集合を扱うクラスは処理を共有でき、同じ処理を書かないように工夫されていました。