C'est une bonne question et je serais heureux de voir que certains en profondeur de la réponse. Toutefois, la documentation officielle dit:
Ces lacunes ont été connues par le
les concepteurs, qui ont délibérément
la décision d'aller avec un chiffon propre, simple
construire qui engloberait le grand
la majorité des cas.
La grande majorité des cas, est la réponse pour moi.
Sur une note de côté, personnellement, je pense qu' foreach
boucle en Java est juste une belle syntaxe pour un itérateur boucle. Ainsi, le compilateur crée un itérateur pour la structure et utilise la variable d'obtenir la valeur pour l'itération en cours. Pour s'assurer que la variable a été initialisée, vous devez le déclarer à la portée de boucle (et je pense que cela empêche la variable d'être utilisé de quelque part d'autre, par exemple dans un autre thread). À cause de cela, vous ne pouvez pas utiliser la variable après la boucle. Mais, c'est juste mon avis et je serais très heureux d'entendre quelqu'un qui la connaît mieux. :)
Edit Voici un article intéressant à propos de foreach
boucles en Java.
Un autre edit j'ai analysé (avec jclasslib le pseudo-code de ces méthodes:
private static void testForEach(ArrayList<String> als) {
for(String s: als)
System.out.println(s);
}
private static void testIterator(ArrayList<String> als) {
for(Iterator<String> is = als.iterator(); is.hasNext();) {
String s = is.next();
System.out.println(s);
}
}
Les deux méthodes sont représentées par le même bytecode:
0 aload_0
1 invokevirtual #2 <java/util/ArrayList.iterator>
4 astore_1
5 aload_1
6 invokeinterface #3 <java/util/Iterator.hasNext> count 1
11 ifeq 34 (+23)
14 aload_1
15 invokeinterface #4 <java/util/Iterator.next> count 1
20 checkcast #5 <java/lang/String>
23 astore_2
24 getstatic #6 <java/lang/System.out>
27 aload_2
28 invokevirtual #7 <java/io/PrintStream.println>
31 goto 5 (-26)
34 return
La différence est dans la ligne 1, la dernière méthode utilise invokevirtual #8
. Cependant, les deux appels suite à l'appel à la même méthode de Iterator
. Donc, il semble que foreach
n'est rien de plus qu'un sucre syntaxique que le compilateur juste se traduit par un prédéfini construire, comme dit la documentation. Cela ne répond pas à la question pourquoi c'est la façon dont il est. J'ai si c'est juste intéressant et pourrait être intéressant de savoir, dans le contexte de la discussion.