Selon le Java Language Specification, § 14.14.2, la variable de l'amélioration de l' for
, la boucle doit être locale à la boucle. En d'autres termes, cette compile:
for (State state : State.values()) {
// do something for each state
}
mais ce n'est pas:
State state;
for (state: State.values()) {
// do something for each state
}
Le JLS ne donne aucune justification de cette langue est un choix de conception. Je peux voir pourquoi le nom du type doit être présent si la variable locale est modifié par final
ou par une annotation, mais je ne comprends pas pourquoi un nu nom d'une variable déclarée ailleurs n'est pas autorisé. Quelqu'un aurait-il tout de comprendre pourquoi cette restriction a été imposée?
MODIFIER
Plusieurs réponses semblent être ce qui suggère que ce qui se passe en dehors de la boucle est la raison pour la conception de la langue cette façon. Peut-être un examen approfondi de la JLS affirme une volonté de clarifier la raison pour laquelle je ne trouve pas convaincantes. Considérer cette boucle, où State
est un enum:
for (State state : State.values()) {
// ...
}
State.values()
est un tableau, donc en fonction de la JLS, la boucle est fonctionnellement identique à:
State[] a = State.values();
for (int i = 0; i < a.length; i++) {
State state = a[i];
// ...
}
Maintenant clairement cette dernière boucle, pourrait avoir été écrit:
State state;
State[] a = State.values();
for (int i = 0; i < a.length; i++) {
state = a[i];
// ...
}
Conceptuellement, cette dernière (parfaitement légal) de la boucle pourrait avoir été utilisé comme l'équivalent fonctionnel de la deuxième renforcée for
boucle ci-dessus (celle qui ne compile pas).
De même, si stateList
est Iterable<State>
(pas un tableau), cette boucle:
for (State state : stateList) {
// ...
}
est fonctionnellement identique à:
for (Iterator<State> iterator = stateList.iterator(); iterator.hasNext(); ) {
State state = iterator.next();
// ...
}
Comme avant, cette dernière boucle pourrait avoir été écrit:
State state;
for (Iterator<State> iterator = stateList.iterator(); iterator.hasNext(); ) {
state = iterator.next();
// ...
}
Encore une fois, ce pourrait avoir été utilisé comme l'équivalent fonctionnel de l' (illégaux):
State state;
for (state : stateList) {
// ...
}
Dans chaque cas, lorsque la boucle, la valeur de state
est parfaitement bien défini (si, peut-être, inutile). Aussi, tout comme la boucle régulière, renforcement de l' for
boucle à l'aide d'un nu nom de la variable qui n'a pas été définie (par exemple, la ligne State state;
était manquant ou hors de portée) pourrait être pris au moment de la compilation. Donc, à partir d'un langage de conception de point de vue, quel est le problème? Pourquoi la langue des designers hors la loi cette construction?