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.2. 継承を眺めてみる¶
2.6.2.1. AbstractCollection。ターゲットのクラス¶
2.6.2.1.1. Collectionインタフェースを実現しています。¶
Collectionインタフェースは要素の集合を扱うクラスはこれを実現することになっています。
ですので、実現するクラスAbstractCollectionではCollectionのメソッドを基本すべてオーバーライドして実装します。
2.6.2.2. Collection。親のインタフェース¶
2.6.2.2.1. Iterableインタフェースを継承しています。¶
Iterableインタフェースはイテレーター(iterator)を処理する機能を持つクラスが実現するインタフェースになります。
Collectionは要素の集まりを扱いますので、イテレーターが必要になります。
※iterator:反復子、繰り返し処理に使うもの(= iterate:繰り返す +or:使うもの)
2.6.3. フィールドを眺めてみる。¶
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.3. size¶
+size():int
+isEmpty():boolean
サイズ(配列の要素数)を取得したりします。
sizeはオーバーライドしなければいけません。
isEmptyはsize()をコールして0だったらtrueを返しているだけです。
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.11. retainAll¶
+retainAll(c:Collection<?>):boolean
ちょうど、removeAllと逆の仕様になっています。
引数cの集合を内部配列に確保(retain)し、それ以外はすべて削除しています。
2.6.5. まとめ¶
AbstractCollectionはCollection仲間の親クラスになります。
要素の集合を扱う操作が集められて実装されています。
これを継承することで要素の集合を扱うクラスは処理を共有でき、同じ処理を書かないように工夫されていました。