Kann man in einer für java erweiterten for-Schleife davon ausgehen, dass der zu schleifende Ausdruck nur einmal ausgewertet wird?

8

In Java eine for-each-Schleife.
Wenn ich eine Methode habe, die ein Array namens genArray() erzeugt.

Wird das Array im folgenden Code jedes Mal erneut generiert, indem genArray() aufgerufen wird? Oder wird Java einmal die Methode aufrufen und eine Kopie vom Array speichern?

%Vor%

Danke

    
Martijn Courteaux 24.10.2009, 15:02
quelle

3 Antworten

23

Über die erweiterte for-Anweisung , die Java-Sprache Spezifikationen schreibt:

  

Die erweiterte for-Anweisung hat die   Formular:

%Vor%      

Der Ausdruck muss einen Typ haben    Iterable oder sonst muss es von einem sein   Array-Typ (§10.1) oder eine Kompilierzeit   Fehler tritt auf.

     

Der Gültigkeitsbereich einer lokalen Variablen, die deklariert wurde   im FormalParameter Teil eines   Verbesserte for -Anweisung (§14.14) ist   die enthaltene Anweisung

     

Die Bedeutung der erweiterten for   Aussage wird durch Übersetzung in gegeben   eine grundlegende for -Anweisung.

     

Wenn der Typ von Expression ist a   Subtyp von Iterable , dann sollte I sein   der Typ des Ausdrucks    Ausdruck. iterator() . Die erweiterte for -Anweisung ist äquivalent   zu einer grundlegenden for Aussage des   Formular:

%Vor%      

Wo #i ist ein Compiler-generiert   Bezeichner, der sich von jedem unterscheidet   andere Bezeichner (Compiler-generiert   oder anders), die im Geltungsbereich sind (§6.3)   an dem Punkt, wo die verbesserte für   Aussage tritt auf.

     

Ansonsten ist der Ausdruck unbedingt erforderlich   hat einen Array-Typ, T[] . Lassen Sie L1 ... Lm   sei die (möglicherweise leere) Folge von   Etiketten unmittelbar vor dem   Verbesserte for -Anweisung. Dann ist die   Bedeutung der erweiterten for-Anweisung   ist gegeben durch die folgenden grundlegenden for   Aussage:

%Vor%      

Wobei a und i vom Compiler generiert werden   Bezeichner, die sich von denen unterscheiden   andere Bezeichner (Compiler-generiert   oder anders), die im Bereich der   Zeigen Sie, wo die erweiterte for-Anweisung   tritt auf.

In Ihrem Fall gibt genArray() keinen Subtyp von Iterable , sondern einen Array-Typ zurück, sodass Ihre erweiterte for -Anweisung der folgenden grundlegenden for -Anweisung entspricht:

%Vor%

Und genArray() wird also nur einmal aufgerufen (aber die aktuell akzeptierte Antwort ist teilweise falsch).

    
Pascal Thivent 24.10.2009, 16:11
quelle
5

Java ruft genArray () einmal auf, ruft das Iterator-Objekt ab und ruft es mehrmals auf.

    
John Stauffer 24.10.2009 15:05
quelle
5

Es sollte nur einmal verwendet werden - es ist das gleiche wie das Aufrufen:

%Vor%     
matt 24.10.2009 15:06
quelle

Tags und Links