getComponents будет вызываться один раз, и возвращает итератор Этот итератор будет вызываться с использованием методов next() и hasNext().
Обновление Подробнее о попытке выхода Skeet Jon Skeet на этот ответ.
Следующая программа показывает, как вызов iterator
выполняется один раз, хотя в коллекции есть три элемента.
public static void main(String[] args) {
List<String> list = new ArrayList<String>() {
public java.util.Iterator<String> iterator() {
System.out.println("iterator() called");
return super.iterator();
};
};
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {
System.out.println(s);
}
}
Выход:
iterator() called
a
b
c
Если запустить это через декомпилятор Java, вы увидите следующий код:
String s;
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.println(s))
s = (String)iterator.next();
Addtionally, так как мы знаем из JLS 14.14.1, что первый раздел инструкции for выполняется только один раз, мы можем быть уверены, что метод iterator не будет вызываться несколько раз.
Jon, как компилятор гарантирует, что getComponents() не имеет побочных эффектов и не производит что-то другое на каждой итерации? (например, если другой поток изменяет компонент?). – Uri
Это не ... но перевод выше - это в основном то, что он определяет. Я попытаюсь найти ссылку на JLS. –
Мой плохой. Я неправильно читаю исходный код. Я думал, что ОП спрашивает, переоценивается ли условие управления в цикле for. Я не заметил, что это было для каждого. – Uri