2016-03-23 5 views
2

Java OOPとJava API /ソースコードの配置に関する次のような状況が混乱しています。 Oracle's Java 8 APIに基づいて、hasNext()は抽象メソッドですが、hasNext()が実装されている場所を見つけることができませんでした。私はプライベート内部クラスは、各コレクションクラスの異なるIteratorsを実装するために使用されているが、実装の場所を見つける方法についての情報はありません。 Eclipse IDEにJava JRE 1.8ソースコードを追加するようユーザーに提案しましたが、Iteratorインターフェースで抽象メソッドとして宣言されているのはboolean hasNext();です。抽象メソッドhasNext()の実装を見つけるにはどうすればよいですか?

以下に示す例では、イテレータobjはhasNext()を直接実装しないで使用します。しかし、私はインターフェイスに抽象メソッドを実装する必要があることを教えられました。

私の質問:
(1)抽象メソッドhasNext()の実装を見つけるにはどうすればよいですか? (2)コメントでコードhereが見つかります。 ArrayListクラスにhasNext()を実装する理由は何ですか?hasNext()を抽象メソッドとしてマークしますか?このようにhasNext()の実装を見つけるのは直感的ではありません。

List<String> list = new ArrayList<String>(); 
    list.add("item-1"); 
    list.add("item-2"); 
    list.add("item-3"); 

    Iterator<String> it = list.iterator(); 
    while (it.hasNext()) { 
     System.out.println(it.next()); 
    } 
+1

どのIDEを使用していますか? IntelliJ IDEAでは、メソッドを選択し、Ctrlキーを押しながらマウスの左ボタンをクリックすると、メソッドが記述されているコードのポイントまでまっすぐに移動します。 –

+3

ここにあります。 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#748 –

+0

「Where is * ArrayListの* Iterator.hasNext()が実装されています。これが当てはまる場合(特に1つの実装を探している場合)、その質問の中でそう言えば役に立ちます。 – dimo414

答えて

-2

next()hasNext()方法はIteratorインタフェースの一部です。それぞれの実装は独自のバージョンを提供します。コモンズコレクションライブラリhereまたはSingletonListIteratorhereArrayListIteratorにどのように定義されているかを見ることができます。

+2

「私は、内部のクラスが異なるイテレータを実装するために使用されていることを知っています」ということは、OPがそれを知っているように見えます。本当の疑問は、「* IDEの特定の実装を簡単に見つける方法*」だと思う。 – Pshemo

+0

私はあなたの要点を見ていますが、間違いなく間違った質問の定式化が、次のような有効な答えに下降してはならないと考えています:「私の質問:抽象メソッドhasNext()は実装されていますか?どうすればそれを見つけることができますか? –

+0

これは、私があなたにダウンボートしなかった理由です(しかし、そうすることから他の人を止めることはできず、OP問題に適切に答えるかどうかわからないので、 – Pshemo

1

あなたのコードでは、リストがArrayListであることがわかります。 というArrayListのメソッドiterator()は、Iteratorの実装を返します。このイテレータの実装では、メソッドhasNext()が実装されます。

興味深いことに、コメントによると、IDEのコードをクリックすることができます(または、それがうまくいかない場合は、デバッガでブレークポイントを設定してステップインします)。 Javaコードを読むことは、それを謎を解くための素晴らしい方法です。

もちろん、Javaの人々は自分たちが何をしているのかを知り、実装した実装を賢明で信頼できるものにすることができます。ここでの注意点は、ドキュメントを読む必要があることです。例えば。このクラスの反復子によって返さhttps://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

イテレータと反復子 からメソッドですフェイルファスト:反復子が作成された後、リストは、構造的に 反復子自体のremove以外の方法で、任意の 時点で変更された場合またはメソッドを追加すると、イテレーターは ConcurrentModificationExceptionをスローします。したがって、同時に の変更があった場合には、 は未定義の時刻に任意の非決定論的な動作を危険にさらすのではなく、迅速かつきれいに失敗します。

関連する問題