In un java migliorato per il loop, è sicuro supporre che l'espressione da ripetere sia valutata una sola volta?

StackOverflow https://stackoverflow.com/questions/1618202

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

È stato utile?

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 contenuta

     

Il significato del migliorato per   la dichiarazione è data dalla traduzione in   un'istruzione per di base.

     

Se il tipo di Expression è a   sottotipo di Iterable , quindi lascia I essere   il tipo di espressione    Espressione. iterator () . L'istruzione for migliorata è equivalente   a un'istruzione for 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[[ . Lascia L1 ... Lm   essere la sequenza (possibilmente vuota) di   etichette che precedono immediatamente il   istruzione migliorata per . Poi il   significato dell'istruzione for avanzata   è dato dal seguente di 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) {
  ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top