- - PR -
Iteratorの具象クラス
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2002-09-13 18:17
初めまして、Iteratorインターフェイスの事で疑問がありましてここに書き込みます。
Vectorクラスのiterator()などを利用して返ってきたiteratorオブジェクトで、 「it.hasNext()」などとしてIteratorインターフェイスのメソッドを呼び出すことが ありますが、実際どのクラスで実装されているメソッドを呼び出しているのでしょうか? Iteratorはインターフェイスであるため、そのメンバであるメソッドも抽象メソッドで あるはずなのに、JavaDocで継承、実装関係を調べても実装しているクラスが見つかりません。 どなたかお教えください。 | ||||
|
投稿日時: 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 パターン? | ||||
|
投稿日時: 2002-09-13 18:50
しょむ様ご回答ありがとうございます。
えー・・・・と、簡単に言うとソレはつまりJavaDocに載っていないPrivateクラスで プログラム実行時に動的に作っているということなのでしょうか? | ||||
|
投稿日時: 2002-09-13 18:56
しょむさんみたいにsrc.zipのソースをgrepして調べるか、あるいはgetClass().getName()するテストコードを書いてみるかですね。
インナクラスとか匿名クラスとかごろごろしてそうですね。 にしてもなぜ知りたいんでしょう? (単なる知的興味?) | ||||
|
投稿日時: 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 というのは実装クラスのことでないでしょうか。 見当違いだったらすみません。 | ||||
|
投稿日時: 2002-09-13 20:30
もちろんその通りです。 しょむさんの載せられたリストの一番上にこれがありますね。 このクラスはprotected staticで、privateではないので、ドキュメントにも載っているわけです。 | ||||
|
投稿日時: 2002-09-13 21:08
> えー・・・・と、簡単に言うとソレはつまりJavaDocに載っていないPrivateクラスで
> プログラム実行時に動的に作っているということなのでしょうか? そゆことです。 まぁ、実行時か呼び出し時かは知りませんが、内部的に Iterator を実装したクラスのインスタンスを作って、外に公開するときは Iterator として公開すると。 # うーむ、こういう使い方ができるとは。勉強になった。 | ||||
|
投稿日時: 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さんは、こういうことが知りたかったんでしょうか? | ||||
