¿Por qué la variable local de un bucle for mejorado tiene que ser local? [duplicar

Esta pregunta ya tiene una respuesta aquí:

Por qué es la declaración de la variable requerida dentro de un ciclo for-each en java 4 respuestas

De acuerdo con laJava Language Specification, § 14.14.2, la variable de una @ mejorafor loop debe ser local para el loop. En otras palabras, esto compila:

for (State state : State.values()) {
    // do something for each state
}

pero esto no:

State state;
for (state: State.values()) {
    // do something for each state
}

The JLS no ofrece justificación para esta elección de diseño de lenguaje. Puedo ver por qué el nombre del tipo debe estar presente si la variable local es modificada porfinal o por una anotación, pero no entiendo por qué no se permite el nombre de una variable declarada en otro lugar. ¿Alguien tiene alguna idea de por qué se impuso esta restricción?

EDITA

Varias respuestas hasta ahora parecen estar sugiriendo que lo que sucede fuera del ciclo es una razón para diseñar el lenguaje de esta manera. Quizás un examen más detallado de lo que dice el JLS aclarará por qué no encuentro esto convincente. Considere este bucle, dondeState es una enumeración:

for (State state : State.values()) {
    // ...
}

State.values() es una matriz, por lo que, de acuerdo con JLS, el bucle es funcionalmente idéntico a:

State[] a = State.values();
for (int i = 0; i < a.length; i++) {
    State state = a[i];
    // ...
}

Ahora claramente este último bucle podría haberse escrito:

State state;
State[] a = State.values();
for (int i = 0; i < a.length; i++) {
    state = a[i];
    // ...
}

Conceptualmente, este último bucle (perfectamente legal) podría haberse utilizado como el equivalente funcional del segundo @ mejorafor loop anterior (el que no se compila).

Similarmente, sistateList es unIterable<State> (no una matriz), este bucle:

for (State state : stateList) {
    // ...
}

es funcionalmente idéntico a:

for (Iterator<State> iterator = stateList.iterator(); iterator.hasNext(); ) {
    State state = iterator.next();
    // ...
}

Al igual que antes, este último bucle podría haberse escrito:

State state;
for (Iterator<State> iterator = stateList.iterator(); iterator.hasNext(); ) {
    state = iterator.next();
    // ...
}

De nuevo, estepodrí se han utilizado como el equivalente funcional de (ilegal):

State state;
for (state : stateList) {
    // ...
}

En cada caso, cuando sale el bucle, el valor destate está perfectamente bien definido (si, tal vez, es inútil). Además, al igual que con el bucle regular, una @ mejorafor loop usando un nombre de variable simple que no fue definido (por ejemplo, la líneaState state; faltaba o estaba fuera del alcance) podría detectarse en tiempo de compilación. Entonces, desde la perspectiva del diseño del lenguaje, ¿cuál es el problema? ¿Por qué los diseñadores de idiomas prohibieron esta construcción?

Respuestas a la pregunta(5)

Su respuesta a la pregunta