In un java migliorato per il loop, è sicuro supporre che l'espressione da ripetere sia valutata una sola volta?
Domanda
In Java, un ciclo per ogni.
Se ho un metodo che genera un array, chiamato genArray ()
.
Nel seguente codice, l'array verrà rigenerato ogni volta chiamando genArray ()
?
O Java chiamerà una volta il metodo e ne memorizzerà una copia dall'array?
for (String s : genArray())
{
//...
}
Grazie
Soluzione
Informazioni su l'istruzione avanzata per , scrive Java Language Specifiche:
L'istruzione for avanzata ha il forma:
EnhancedForStatement: for ( VariableModifiersopt Type Identifier: Expression) Statement
L'espressione deve avere il tipo
Iterable
oppure deve essere di tipo di array (§10.1) o un tempo di compilazione si verifica un errore.L'ambito di una variabile locale dichiarato nella parte FormalParameter di un istruzione
per
migliorata (§14.14) è la dichiarazione contenutaIl significato del
migliorato per
la dichiarazione è data dalla traduzione in un'istruzioneper
di base.Se il tipo di
Expression
è a sottotipo diIterable
, quindi lasciaI
essere il tipo di espressione Espressione.iterator ()
. L'istruzionefor
migliorata è equivalente a un'istruzionefor
di base del forma:for (I #i = Expression.iterator(); #i.hasNext(); ) { VariableModifiersopt Type Identifier = #i.next(); Statement }
Dove
#i
è generato da un compilatore identificatore distinto da qualsiasi altri identificatori (generati dal compilatore o altrimenti) che rientrano nell'ambito di applicazione (§6.3) nel punto in cui il potenziato per si verifica l'istruzione.Altrimenti, l'espressione necessariamente ha un tipo di array,
T[[
. LasciaL1 ... Lm
essere la sequenza (possibilmente vuota) di etichette che precedono immediatamente il istruzionemigliorata per
. Poi il significato dell'istruzione for avanzata è dato dal seguentedi base per
dichiarazione:T[] a = Expression; L1: L2: ... Lm: for (int i = 0; i < a.length; i++) { VariableModifiersopt Type Identifier = a[i]; Statement }
Dove a e i sono generati dal compilatore identificatori che sono distinti da qualsiasi altri identificatori (generati dal compilatore o altrimenti) che rientrano nell'ambito di applicazione di punto in cui l'istruzione for avanzata si verifica.
Quindi, nel tuo caso, genArray ()
non restituisce un sottotipo di Iterable
ma un tipo di array, quindi la tua istruzione for
migliorata è equivalente alla seguente istruzione di base per
:
String[] a = genArray();
...
for (int i = 0; i < a.length; i++) {
String s = a[i];
// ...
}
E genArray ()
verrà quindi chiamato solo una volta (ma la risposta attualmente accettata è parzialmente sbagliata).
Altri suggerimenti
Java chiamerà genArray () una volta, otterrà l'oggetto iteratore e lo chiamerà più volte.
Dovrebbe essere usato solo una volta - è lo stesso che chiamare questo:
String[] strings = genArray();
for (String s : strings) {
...