- PR -

Iteratorの具象クラス

投稿者投稿内容
jim
会議室デビュー日: 2002/09/13
投稿数: 5
投稿日時: 2002-09-13 18:17
初めまして、Iteratorインターフェイスの事で疑問がありましてここに書き込みます。

Vectorクラスのiterator()などを利用して返ってきたiteratorオブジェクトで、
「it.hasNext()」などとしてIteratorインターフェイスのメソッドを呼び出すことが
ありますが、実際どのクラスで実装されているメソッドを呼び出しているのでしょうか?
Iteratorはインターフェイスであるため、そのメンバであるメソッドも抽象メソッドで
あるはずなのに、JavaDocで継承、実装関係を調べても実装しているクラスが見つかりません。

どなたかお教えください。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-09-13 18:28
j2sdk 1.4.1 のソースから implements Iterator を grep。

$ grep -r ' Iterator' . | grep implements
./beans/beancontext/BeanContextSupport.java: protected static final class BCSIterator implements Iterator {
./util/AbstractList.java: private class Itr implements Iterator {
./util/HashMap.java: private abstract class HashIterator implements Iterator {
./util/Hashtable.java: private class Enumerator implements Enumeration, Iterator {
./util/Hashtable.java: private static class EmptyIterator implements Iterator {
./util/IdentityHashMap.java: private abstract class IdentityHashMapIterator implements Iterator {
./util/LinkedHashMap.java: private abstract class LinkedHashIterator implements Iterator {
./util/TreeMap.java: private class EntryIterator implements Iterator {
./util/WeakHashMap.java: private abstract class HashIterator implements Iterator {

private な class でごりごり作ってるんですな。

ある意味、Factory パターン?
jim
会議室デビュー日: 2002/09/13
投稿数: 5
投稿日時: 2002-09-13 18:50
しょむ様ご回答ありがとうございます。

えー・・・・と、簡単に言うとソレはつまりJavaDocに載っていないPrivateクラスで
プログラム実行時に動的に作っているということなのでしょうか?
DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2002-09-13 18:56
しょむさんみたいにsrc.zipのソースをgrepして調べるか、あるいはgetClass().getName()するテストコードを書いてみるかですね。
インナクラスとか匿名クラスとかごろごろしてそうですね。

にしてもなぜ知りたいんでしょう?
(単なる知的興味?)
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-09-13 19:57
皆様はじめまして。
amnakyといいます。
いきなりですが、
http://java.sun.com/j2se/1.4/docs/api/java/util/Iterator.html
上記Javadocにある
All Known Implementing Classes:
BeanContextSupport.BCSIterator

というのは実装クラスのことでないでしょうか。
見当違いだったらすみません。

DaikiRyuto
大ベテラン
会議室デビュー日: 2002/07/23
投稿数: 200
投稿日時: 2002-09-13 20:30
引用:

amnakyさんの書き込み (2002-09-13 19:57) より:
皆様はじめまして。
amnakyといいます。
いきなりですが、
http://java.sun.com/j2se/1.4/docs/api/java/util/Iterator.html
上記Javadocにある
All Known Implementing Classes:
BeanContextSupport.BCSIterator

というのは実装クラスのことでないでしょうか。
見当違いだったらすみません。



もちろんその通りです。
しょむさんの載せられたリストの一番上にこれがありますね。
このクラスはprotected staticで、privateではないので、ドキュメントにも載っているわけです。

しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-09-13 21:08
> えー・・・・と、簡単に言うとソレはつまりJavaDocに載っていないPrivateクラスで
> プログラム実行時に動的に作っているということなのでしょうか?

そゆことです。
まぁ、実行時か呼び出し時かは知りませんが、内部的に Iterator を実装したクラスのインスタンスを作って、外に公開するときは Iterator として公開すると。

# うーむ、こういう使い方ができるとは。勉強になった。
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-09-14 01:25
興味があるので個人的に少し調べてみました。
jimさんがVectorを例にとっているのでVectorでやってみます。

調べた対象はj2sdk1.4.0_02のソースです。

まず、
Vectorクラスのiterator()から。
java.util.Vectorのソースを見ても、iterator()メソッドは実装されていません。
そこで、Vectorが継承しているjava.util.AbstractListのjavadocを見ると、
iteratorの実装を提供しているという記述があったので、ソースを見ます。
すると、
public Iterator iterator() {
return new Itr();
}
とあります。このItrというクラスがあやしいなと。
しょむさんのgrepにひっかかってますね。
このクラスは、AbstractListの内部クラスです。

private class Itr implements Iterator

と宣言されています。
このクラスが、java.util.Iteratorの
hasNext(), next(), remove()を実装していました。
hasNext()は、コレクション内のカーソルが最大値ならfalseを返す、
next()は、オブジェクトを一つ取り出し、カーソルを一つ進めるという
非常に単純な作りです。非同期に対応したチェックらしきものは入ってますが。

Collectionフレームワークの詳しいしくみはわかりませんが、
他もこんな感じなんじゃないでしょうか。
ちなみにDaikiRyutoさんのおっしゃるgetClass().getName()をやってみたところ、

java.util.AbstractList$Itr

とでました。

簡単ですが、参考になれば。
jimさんは、こういうことが知りたかったんでしょうか?

スキルアップ/キャリアアップ(JOB@IT)