Ответ 1
Это хороший вопрос, и я был бы рад увидеть какой-то подробный ответ. Однако официальная документация гласит:
Эти недостатки были известны дизайнеров, которые решение пойти с чистым, простым конструкции, которая в большинстве случаев.
Подавляющее большинство случаев - это ответ для меня.
На стороне примечания, лично, я думаю, что цикл foreach
в Java - это просто хороший синтаксис для стандартного цикла итератора. Таким образом, компилятор создает итератор для структуры и использует переменную для получения значения для текущей итерации. Чтобы убедиться, что переменная была инициализирована, вам нужно объявить ее для области цикла (и я думаю, что это предотвращает использование переменной в другом месте, например, в другом потоке). Из-за этого вы не можете использовать переменную после цикла. Но, это только мое мнение, и я был бы очень рад услышать от кого-то, кто знает это лучше.:)
Изменить Вот интересная статья о циклах foreach
в Java.
Другое редактирование Я проанализировал (с jclasslib байт-код этих методов:
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);
}
}
Оба метода представлены одним и тем же байткодом:
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
Разница заключается в строке 1, последний метод использует invokevirtual #8
. Однако оба вызова приводят к вызову того же метода Iterator
. Таким образом, кажется, что foreach
- не что иное, как синтаксический сахар, который компилятор просто переводит в предопределенную конструкцию, точно так же, как говорится в документации. Это не отвечает на вопрос, почему так оно и есть. Я, хотя это просто интересно и, возможно, стоит знать, в контексте обсуждения.