Em um java loop for aprimorado, é seguro assumir a expressão para ser enrolada ao longo serão avaliados apenas uma vez?
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
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 contidaO significado da
for
reforçada declaração é dada pela tradução para o uma declaração básicafor
.Se o tipo de
Expression
é um subtipo deIterable
, então deixeI
ser o tipo de expressão Expression.iterator()
. A declaraçãofor
reforçada é equivalente com um comunicadofor
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[]
. VamosL1 ... Lm
ser a sequência (possivelmente vazio) de rotula imediatamente anterior à declaraçãofor
reforçada. Então o significado da instrução for aprimorada é dado pela seguintefor
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) {
...