Em um java loop for aprimorado, é seguro assumir a expressão para ser enrolada ao longo serão avaliados apenas uma vez?

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

Pergunta

Em Java, um for-each loop.
Se eu tiver um método que gera um array, chamado genArray().

No código a seguir, vai a matriz cada vez ser re-gerado pelo telefone genArray()? Ou será chamada Java uma vez que o método e armazenar uma cópia da matriz?

for (String s : genArray())
{
    //...
}

Graças

Foi útil?

Solução

a instrução for aprimorada , as especificações Java idioma escreve:

A instrução for aprimorada tem a Forma:

EnhancedForStatement:
        for ( VariableModifiersopt Type Identifier: Expression) Statement

A Expressão deve ou têm o tipo Iterable ou então ele deve ser de um tipo de matriz (§10.1), ou um tempo de compilação erro ocorre.

O escopo de uma variável local declarada na parte de uma FormalParameter declaração reforçada for (§14.14) é A afirmação contida

O significado da for reforçada declaração é dada pela tradução para o uma declaração básica for.

Se o tipo de Expression é um subtipo de Iterable, então deixe I ser o tipo de expressão Expression. iterator(). A declaração for reforçada é equivalente com um comunicado for básica do Forma:

for (I #i = Expression.iterator(); #i.hasNext(); ) {

        VariableModifiersopt Type Identifier = #i.next();
   Statement
}

Onde #i é um compilador-gerado identificador que é distinto de qualquer outros identificadores (compilador-gerado ou de outro modo) que estão dentro do escopo (§6.3) no ponto em que o reforço do declaração ocorre.

Caso contrário, o Expression necessariamente tem um tipo de matriz, T[] . Vamos L1 ... Lm ser a sequência (possivelmente vazio) de rotula imediatamente anterior à declaração for reforçada. Então o significado da instrução for aprimorada é dado pela seguinte for básica declaração:

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}

Onde a e i são gerados compilador de identificadores que são distinto de qualquer outros identificadores (compilador-gerado ou de outro modo) que estão no escopo no ponto em que a instrução for aprimorada ocorre.

Assim, no seu caso, genArray() não retorna um subtipo de Iterable mas um tipo de matriz, assim que sua declaração for reforçada é equivalente à seguinte declaração for básica:

String[] a = genArray();
...
for (int i = 0; i < a.length; i++) {
    String s = a[i];
    // ...
}

E genArray() vai, assim, ser chamado apenas uma vez (mas a resposta atualmente aceita é parcialmente errado).

Outras dicas

Java vai chamar genArray () uma vez, obter o objeto iterador, e chamada que várias vezes.

Ele só deve se acostumar uma vez - é o mesmo que chamar isto:

  String[] strings = genArray();
  for (String s : strings) {
  ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top