2016-03-23 10 views
2

Ich bin verwirrt über die folgende Situation im Zusammenhang mit Java OOP und Java API/Quellcode-Anordnung. Basierend auf Oracle's Java 8 API ist hasNext() eine abstrakte Methode, aber ich konnte nicht finden, wo hasNext() implementiert ist. Ich habe gelesen, dass private innere Klassen verwendet werden, um verschiedene Iteratoren in jeder Collection-Klasse zu implementieren, aber es gibt keine weiteren Informationen darüber, wie der Speicherort der Implementierung gefunden werden kann. Einige Benutzer haben mir vorgeschlagen, Java JRE 1.8-Quellcode zu meiner Eclipse-IDE hinzuzufügen, aber ich kann nur boolean hasNext(); als abstrakte Methode in der Iterator-Schnittstelle deklarieren.Wie finde ich die Implementierung der abstrakten Methode, hasNext()?

Wie im folgenden Beispiel gezeigt, verwendet der Iterator obj hasNext() direkt ohne es zu implementieren. Mir wurde jedoch beigebracht, dass Sie eine abstrakte Methode in einer Schnittstelle implementieren müssen.

Meine Frage:
(1) Wie finde ich die Implementierung der abstrakten Methode, hasNext()? (2) Ein Kommentar sagt, dass ich den Code here finden kann. Was ist der Grund, hasNext() in der ArrayList-Klasse zu implementieren, aber hasNext() als abstrakte Methode zu markieren? Es ist nicht intuitiv, die hasNext() - Implementierung auf diese Weise zu finden.

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

Welche IDE verwenden Sie? In IntelliJ IDEA können Sie eine Methode auswählen, STRG drücken und mit der linken Maustaste klicken, und Sie gelangen direkt zu dem Punkt im Code, an dem die Methode geschrieben wurde. –

+3

Genau hier. http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#748 –

+0

Es klingt wie Sie versuchen zu fragen "Wo ist * ArrayLists * 'Iterator.hasNext()' implementiert.Wenn das der Fall ist (Sie suchen nach einer Implementierung im Besonderen), ist es hilfreich, dies in der Frage zu sagen. – dimo414

Antwort

-2

Die next() und hasNext() Verfahren sind ein Teil der Iterator Schnittstelle. Jede spezifische Implementierung wird ihre eigenen Versionen bereitstellen. Sie können sich ansehen, wie sie für die ArrayListIterator in der Commons-Collection-Bibliothek here oder SingletonListIteratorhere definiert sind.

+2

Basierend auf "Ich weiß, dass private innere Klassen verwendet werden, um verschiedene Iteratoren zu implementieren" sieht es aus, als ob OP das weiß. Ich vermute, dass die wirkliche Frage ist "* wie man leicht spezifische Implementierung in IDE findet *". – Pshemo

+0

Ich sehe Ihren Standpunkt, aber ich denke ehrlich, dass eine wohl falsche Formulierung der Frage nicht zu einem Downvote auf eine einigermaßen gültige Antwort führen sollte: "Meine Frage: Wo ist die abstrakte Methode, hasNext(), implementiert? Wie finde ich es? ' –

+0

Stimmen Sie zu, deshalb habe ich Sie nicht abgelehnt (aber kann andere nicht davon abhalten und kann Sie nicht auffordern, weil ich nicht sicher bin, ob es die OP-Frage richtig beantwortet). – Pshemo

1

Sie können in Ihrem Code sehen, dass List eine ArrayList ist. Die Methode in ArrayList namens iterator() wird eine Implementierung von Iterator zurückgeben. Bei dieser Implementierung von Iterator wird die Methode hasNext() implementiert.

Es ist toll, neugierig zu sein, und wie der Kommentar sagte, können Sie den Code in einer IDE anklicken (oder wenn das für Sie nicht funktioniert, setzen Sie einen Breakpoint in einem Debugger und treten ein). Das Lesen des Java-Codes ist ein guter Weg, um ihn zu entmystifizieren.

Natürlich können Sie im Allgemeinen erwarten, dass die Java-Leute wissen, was sie tun, und darauf vertrauen, dass die Implementierungen, die Sie erhalten, sinnvoll und für den allgemeinen Gebrauch geeignet sind. Der Vorbehalt hier ist, dass Sie auch die Dokumentation lesen sollten. z.B. von https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

Die Iteratoren von Klasse dieser Iterator und ListIterator Methoden zurückgegeben werden ausfall schnell: wenn die Liste jeder Zeit geändert wird strukturell nach der Iterator erstellt wird, in irgendeiner Weise außer durch die eigene Entfernen des Iterator oder Methoden hinzufügen, wirft der Iterator eine ConcurrentModificationException. Angesichts der gleichzeitigen Modifikation versagt daher der Iterator schnell und sauber, anstatt zu einem unbestimmten Zeitpunkt in der Zukunft ein willkürliches, nicht-deterministisches Verhalten zu riskieren.

Verwandte Themen